2011-11-05 32 views
2

我的问题是,该代码只适用于很小的输入字符串C:大字符串输入 - >分段错误

代码应该检查输入是否是Palindrom。这里面有两个选择,我实现了他们额外的功能(这个错误也appers,当我评论的功能了)

例如: 输入“奥托” - 是好的 “reliefpfeiler” - 是好的 “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx “ - >段错误

int main(int argc, char **argv) 
{ 
    char* str; 
    int erg; 
    int c; 
    char stroriginall[50]; 

    fgets(str,50,stdin); 
    str[strlen(str)-1]='\0'; 

    if(strlen(str)>40) 
    { 
     printf("%s: Error, input must <=40!",argv[0]); 
     return 1; 
    } 

    strcpy(stroriginall,str); 

    while ((c=getopt(argc, argv, "si")) != -1) 
    { 
     switch(c) 
     { 
     case 's': 
     str=removeSpaces(str); 
     break; 
     case 'i': 
     toLowerCase(str); 
     break; 
     } 
    } 

    erg=checkPalindrom(str); 

    if(erg==0) 
    { 
     printf("%s ist ein Palindrom\n",stroriginall); 
    } 
    else 
    { 
     printf("%s ist kein Palindrom\n",stroriginall); 
    } 

    return 0; 
} 

我希望有人能帮助我:)

回答

6

你的一个问题是,str只是一个指针(未初始化为此事),你还没有分配的任何内存为了它。参见:

char* str; 
int erg; 
int c; 
char stroriginall[50]; 

fgets(str,50,stdin); 

char* str更改为char str[50]。对fgets的呼叫存储50 char s到缓冲区指针str,没有为str分配内存,所以你会segfault。

我们也没有定义你的调用函数哪里可能会有更多的问题。

您还应该启用编译器中的所有警告,以便在编译时指出这些问题(如果它尚未这样做的话)。

+0

谢谢 - 但我不明白为什么它使用小输入? – nikmaster

+2

@ user1030620我很惊讶它在所有的工作,行为是完全* undefined *。 – AusCBloke