[C] EOF-Zeichen in char-Array

myhonor

Mitglied
ich will eine Datei einlesen und in einem Array speichern (mit Speicherreservierung). Das Problem ist, dass das Programm mein EOF-Zeichen (ÿ in html) ins letzte Array mitspeichert. Wie kann ich das verhindern?

mfg myhonor
 
Das klingt wie ein Programmierfehler. Bist du sicher, dass du nach dem Dateiende auch mit dem Einlesen/Verarbeiten aufhörst? Poste doch einfach mal deinen Code.
 
Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char *input;
	char INPUT;
	char *m_input = NULL;
	int input_counter = 0;
	int b = 0;
	int c = 0;

	input = malloc(sizeof(char));
	m_input = malloc(10 * sizeof(char));

	while ((*input=getchar()) != EOF)
	{
		INPUT=*input;
		switch(*input)
		{
		case '@':
			{
				if (m_input == NULL)
				{
					m_input = realloc(m_input, 7 * sizeof(char));
				}
				m_input[b++] = ' ';
				m_input[b++] = '[';
				m_input[b++] = 'a';
				m_input[b++] = 't';
				m_input[b++] = ']';
				m_input[b++] = ' ';
			} break;
		default:
			{
				if (m_input == NULL)
				{
					m_input = realloc(m_input, 2 * sizeof(char));
				}

				m_input[b] = *input;
				b++;
			}
		}
		putchar(INPUT);
		input_counter++;					
	}

	printf("\n----------\n");
	int i;
	for (i=0;i<=b;i++)
	{
		printf("b(%d) =\t%p\t%c\n", i, &m_input[i], m_input[i]);
	}

	free(input);
	free(m_input);
	
	return EXIT_SUCCESS;
}

Ich glaub mit der dynamischen Speicherreservierung stimmt auch was nicht.
 
Warum allozierst du Speicher für ein einzelnes (bzw. 10) Zeichen dynamisch? Das macht nicht viel Sinn.

Außerdem liefert die Funktion getchar einen int zurück!

C:
int input;

while ((input = getchar()) != EOF) {
  switch (input) {
     ...
  }
}

Und warum prüfst du ständig ob m_input NULL ist? Du mußt schon irgendwie prüfen ob m_input genug Platz hat und wenn nicht realloc aufrufen (dazu mußt du dir natürlich erstmal merken wieviel Speicher gerade alloziert ist).

Bei der Ausgabe hast du einen Off-By-One Fehler
C:
for (i = 0; i < b; ++i) {
   ...
}
Gruß
 
Ok, danke für den Hinweis mit int, aber wie kann ich ein int in einen char übertragen? muss ich es casten? mit pointern soll das angeblich ne heikle angelegenheit sein.
 
Ich hab jetzt zusätlich folgendes hingeschrieben:

Code:
#define MAX 10
int s_max = MAX;                                                // s_max = Speicher Max (10)
m_input = malloc (s_max*sizeof(char);        // reservier 10 Bytes
s_max += s_max;                                              // bei if (m_input == NULL)
 
Ich hab jetzt zusätlich folgendes hingeschrieben:

Code:
#define MAX 10
int s_max = MAX;                                                // s_max = Speicher Max (10)
m_input = malloc (s_max*sizeof(char);        // reservier 10 Bytes
s_max += s_max;                                              // bei if (m_input == NULL)
Nochmal: wie sollte m_input denn plötzlich NULL sein?

Die Bedingung müßte so aussehen:
C:
if ((s_max - b) < anzahl_benoetigte_zeichen) {
  // reallozieren falls der Speicher nicht ausreicht.
  ...
}
Übrigens wäre es sinnvoller den Speicher nicht jedesmal zu re-allozieren, sondern z.B. gleich immer um 500 Zeichen zu erhöhen.

Gruß
 
Übrigens wäre es sinnvoller den Speicher nicht jedesmal zu re-allozieren, sondern z.B. gleich immer um 500 Zeichen zu erhöhen.

Gruß

Es ist ein beliebig langer Text in einem txt-File gelesen. Haben ein Testfile bekommen, aber das hat keine 300 Zeichen. Außerdem ist es verlangt, jedes Mal den Speicher neu zu allozieren, damit kein Speicher verschwendet wird.
 
Zurück