2017-06-02 95 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]; 
}