Das ist doch schön :)
1. Achso. Ist in diesem Fall aber nicht nötig. Globale Variablen sind zu vermeiden, wo auch immer möglich.
2. Ja, hab ich mir nacher auch so gedacht, macht ja auch Sinn. Wo ist die Edit-Funktion, wenn man sie braucht?^^
4. Kennt man ;) Wird mit der Zeit aber auch besser/einfacher.
6. Nur weil du einer Variablen (oder halt nem Array) keinen Wert zuweist, heißt es nicht, dass keiner drinsteht. Speicher wird ja nicht ständig auf 0 gesetzt. Eine nicht initialisierte Variable kann also alles enthalten, und bei jedem Start etwas anderes.
Ausgehend von deiner Originalfunktion: Schlägt nun die Prüfung fehl, wird das erste Byte nicht überschrieben, enthält also weiterhin den 'zufälligen' Wert von vorher. Dieser wird nun in der while-Schleife gegen 0 geprüft. Hatte er vorher zufällig 0, wird halt abgebrochen. Ich hoffe, das ist nun verständlich ;)
Deine korrigierte Funktion hat das Problem nicht mehr, da du in jedem Fall das zuletzt gelesene Zeichen einliest.
Folgendes fällt mir noch auf:
1. i wird für jedes gelesene Zeichen inkrementiert, wahrscheinlich nur Klammern vergessen
2. Doch, die Abfrage funktioniert schon, nur die dann ausgeführte Aktion nicht ;) Du gibst nur einen Hinweis aus, machst aber sonst nichts. break z.B. könnte man machen.
3. Achso, hatte ich in A1 vergessen, ist mir erst später aufgefallen, als ich mal versucht hab, selber was zu schreiben. Dein String ist nach dem Einlesen nicht Nullterminiert. Das sollte man noch ändern, sowas kann (=wird sehr wahrscheinlich) zu ganz unschönen Ausgaben führen, wenn das Programm nicht grade im Debugger läuft.
Wie gesagt hatte ich ja mal was geschrieben, wie ich das machen würde:
//ich hab den string mal s genannt. ist kuerzer :)
#define ZIFFERN_MAX 100
char s[ZIFFERN_MAX];
void string_fuellen_index()
{
int i=0;
char c; //temporaere Variable
printf("Bitte eine Zeichenkette eingeben: ");
do
{
c=getchar();
if((c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z')||(c >= '0' && c <= '9'))
{
s[i]=c; //Zeichen gueltig: in den String kopieren
++i; //und die Position erhoehen
}
//else: kopiere das Zeichen nicht in den String
} while(c!=0 && c!=EOF && i<ZIFFERN_MAX-1)
//wenn 0 oder EOF zurueckgegeben wurde oder der
//String bis auf ein Element (daher -1) voll ist,
//breche ab
s[i]=0; //Da eine 0 nicht in das Array geschrieben wird, da das
//Zeichen im Bereich A-Z, a-z, 0-9 liegen muss, wird hier noch
//die 0 an den String angehaengt
}
Muss aber dazu sagen, dass ich das nicht getestet habe. Es könnten sogar Syntaxfehler drin sein. Meine Funktion sieht deiner sehr ähnlich, wenn man mal vom Längenabbruch und der Prüfung auf \n bzw. EOF, sowie fflush(stdin) absieht. Da ist deines aber wahrscheinlich richtig, da ich mir bei diesen Sachen nie sicher bin und das auch erst n paar mal ausprobieren muss und es, wie gesagt, nicht getan hab^^
Ele