C: Большой ввод строки -> Ошибка сегментации - PullRequest
2 голосов
/ 05 ноября 2011

Моя проблема в том, что этот код работает только с крошечными строками ввода

Код должен проверять, является ли вход Палиндромом. И есть два варианта, я реализую их в дополнительных функциях (эта ошибка также возникает, когда я закомментирую функции)

например: ввод "отто" - нормально «рельефный продавец» - это нормально «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;
}

я надеюсь, что кто-нибудь может мне помочь:)

1 Ответ

6 голосов
/ 05 ноября 2011

Одна из ваших проблем в том, что 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 памяти не выделено, поэтому вы будете иметь ошибку.

У нас также нет определения функций, которые вы вызываете, где может быть гораздо больше проблем.

Вам также следует включить все предупреждения на вашем компиляторе, чтобы эти проблемы были указаны вам во время компиляции (если это еще не было сделано).

...