【问题标题】:C: Large String input --> Segmentation FaultC:大字符串输入-->分段错误
【发布时间】:2011-11-05 01:26:03
【问题描述】:

我的问题是,这段代码只适用于微小的输入字符串

代码应该检查输入是否是回文。并且有两个选项,我在额外的函数中实现它们(这个错误也会出现,当我注释掉函数时)

例如: 输入“otto” - 没问题 “reliefpfeiler” - 没关系 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" --> 分段错误

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;
}

我希望有人可以帮助我:)

【问题讨论】:

    标签: c string segmentation-fault


    【解决方案1】:

    您的一个问题是str 只是一个指针(就此而言未初始化)并且您没有为它分配任何内存。见:

    char* str;
    int erg;
    int c;
    char stroriginall[50];
    
    fgets(str,50,stdin);
    

    char* str 更改为char str[50]。对fgets 的调用将50 个chars 存储到str 指向的缓冲区指针中,没有为str 分配内存,所以你会出现段错误。

    我们也没有您调用的函数的定义,可能会出现更多问题。

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

    【讨论】:

    • 谢谢 - 但我不明白为什么它在少量输入的情况下也有效?
    • @user1030620 我很惊讶它完全起作用,行为完全未定义
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多