2017-06-02 94 views
1

我正在寫一個C函數來獲取字符串(* s)中的下一個單詞並將其複製到緩衝區(* w)中。它返回單詞的第一個字符。將char *傳遞給函數將返回不同於傳遞char []的結果?

當輸入字符串是一個char指針(char *文本)時它工作正常,但是當我將類型更改爲char數組(char [MAXTEXT])時,程序崩潰。

這讓我感到困惑,因爲我認爲無論如何編譯器會將字符數組「腐爛」到char指針中。我相信,輸入是字符指針還是字符數組不應該有所作爲?

(該聲明是在第10行char *text = "This should return the first word";,當改爲char text[MAXTEXT] = "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

當你聲明'word'爲指針,*哪裏它指向* –

+0

無處了嗎??當我設置聲明時,我不是簡單地將內存用於初始化指向char的指針嗎?初始化發生在getword()函數內部。 –

+0

此外,除非您明確地將'EOF'放入'text'緩衝區,否則它永遠不會包含具有該值的字符。如果你這樣做了,那麼你的'EOF'是一個*'int' *而不是一個char,並且有可能出現'(char)EOF!= EOF'(這取決於'char'是'unsigned'或不是,這是編譯器特有的)。標準I/O字符函數返回「int」而不是「char」是有原因的。 –

回答

2

的問題是,對於指針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]; 
}