2017-06-02 12 views
1

私は文字列(* s)から次の単語を取得し、それをバッファ(* w)にコピーするためにC言語で関数を書いています。単語の最初の文字を返します。char *を関数に渡すと、char []を渡す以外の結果が返されますか?

入力文字列がcharポインタ(char * text)のときはうまく動作しますが、タイプをchar配列(char [MAXTEXT])に変更するとプログラムがクラッシュします。

私はコンパイラの「崩壊した」char配列をcharポインタにとにかく思ったので、これは私を混乱させます。私の信念としては、入力がcharポインタかchar配列かどうかで違いはありませんか?

(宣言はchar text[MAXTEXT] = "This should return the first word";に変化したときにクラッシュライン10 char *text = "This should return the first word";、である)

#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

は、*それが指しん* –

+0

をどこにもまだ?宣言を設定すると、charを指すポインタの初期化のためのメモリを単に確保するだけではないのですか?初期化はgetword()関数の内部で行われます。 –

+0

また、明示的に 'EOF'を' text'バッファに入れない限り、その値を持つ文字は決して含まれません。そして、もしあなたがそうするなら、あなたは 'EOF'がcharではなく' int' *であり、 '(char)EOF!= EOF'というチャンスがあります(' char'が'unsigned'かどうかはコンパイラによって異なります)。標準I/O文字関数が 'int'を返し、' char'を返さない理由があります。 –

答えて

2

問題がポインタwordために、あなたが任意のメモリが割り当てられていないことです。メモリを割り当てるだけで問題は解決されます。 あなたの配列の実装:あなたは `ポインタとして宣言するword`

#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]; 
} 
関連する問題