Ich schreibe eine Funktion in C, um das nächste Wort aus einer Zeichenfolge (* s) zu erhalten und in den Puffer (* w) zu kopieren. Es gibt den ersten Buchstaben des Wortes zurück.Übergabe von char * an Funktion gibt andere Ergebnisse zurück als char [] übergeben?
Es funktioniert gut, wenn die Eingabezeichenfolge ein Char-Zeiger (Char * Text) ist, aber wenn ich den Typ in ein Char-Array (char [MAXTEXT]) ändern, stürzt das Programm ab.
Das verwirrt mich, da ich dachte, dass der Compiler Char-Arrays sowieso in Char-Pointer verfallen ließ. Zu meiner Überzeugung, ob die Eingabe ein Char-Zeiger oder ein Char-Array ist, sollte keinen Unterschied machen?
(Die Erklärung ist in Zeile 10 char *text = "This should return the first word";
, die, wenn sie geändert char text[MAXTEXT] = "This should return the first word";
abstürzt)
#include <stdio.h>
#include <ctype.h>
#define MAXTEXT 1000
int getword(char *inp, char *out, int lim);
void main()
{
char *text = "This should return the first word";
char *word;
int i, c;
printf("%c", getword(text, word, MAXTEXT));
printf("%s", word);
}
int getword(char *s, char *w, int lim)
{
static int bufp = 0;
char c;
char *word = w;
while (isspace(c = s[bufp++]));
if (c != EOF)
*w++ = c;
else if (!isalpha(c))
{
*w = '\0';
return c;
};
for (; --lim > 0; bufp++)
if (isalpha(c = s[bufp]) || c == '\'')
*w++ = s[bufp];
else
break;
*w = '\0';
return word[0];
}
Wenn Sie 'declare als Zeiger word', * wo kommt Punkt es * –
Nirgends noch? Wenn ich Deklarationen einstelle, lege ich nicht einfach Speicher für die Initialisierung eines Zeigers beiseite, der auf ein Zeichen zeigt? Die Initialisierung findet innerhalb der Funktion getword() statt. –
Auch wenn Sie 'EOF' nicht explizit in den' text'-Puffer setzen, enthält es niemals Zeichen mit diesem Wert. Und wenn Sie das tun, dann haben Sie das Problem, dass'EOF' ein * 'int' * ist und kein Char, und dass es Chancen gibt, dass' (char) EOF! = EOF' (hängt davon ab, ob 'char' ist) 'unsigned' oder nicht, was compilerspezifisch ist. Es gibt einen Grund, warum die Standard-I/O-Zeichenfunktionen ein "int" und kein "char" zurückgeben. –