2017-06-02 1 views
1

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]; 
} 
+2

Wenn Sie 'declare als Zeiger word', * wo kommt Punkt es * –

+0

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. –

+0

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. –

Antwort

2

Das Problem ist, dass für den Zeiger word, Sie keine Speicher zugewiesen haben. Durch einfaches Zuweisen von Speicher wird das Problem behoben. Ihre Array Implementierung:

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXTEXT 1000 

char getword(char *inp, char *out, int lim); 

int main() 
{ 
    char text[100],word[100]; 
    // char *text = (char*)calloc(100,sizeof(char)); 
    strcpy(text,"This should return the first word"); 
    // char *word = (char*)calloc(100,sizeof(char)); 
    int i, c; 

    printf("%c", getword(text, word, MAXTEXT)); 
    // printf("%s", text); 
    return 0; 
} 

char 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]; 
} 
Verwandte Themen