Почему эта программа дает ошибку сегментации? - PullRequest
2 голосов
/ 17 сентября 2010

Это вопрос для начинающих: почему это ломает / дает ошибку?

#include <stdio.h>    
#include <stdlib.h> 
#include <string.h>

char *strtrim_right(char *p)
{
  char *end;
  int len;
  len = strlen( p);
  while (*p && len)
    {
    end = p + len-1;
    if(isalpha(*end))
     *end =0;
   else 
    break;      
    }
  return(p);
}


int main ()  
{  
  char *x="PM123BFD";
  strtrim_right(x);
  printf("%s", x);
  return 0;
}  

Ответы [ 3 ]

11 голосов
/ 17 сентября 2010

Изменить

char *x="PM123BFD";

на

char x[]="PM123BFD";

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

5 голосов
/ 17 сентября 2010

Я не понимаю, почему он должен прерываться - я бы предпочел ожидать бесконечного цикла: условие while всегда будет истинным, а цикл никогда не останется.BORKED.Затем посмотрите на имеющиеся у вас переменные: вы никогда не меняете значения p или len.Это не правильно.Кроме того, код внутри цикла гораздо сложнее, чем нужно.Подумайте, действительно ли вам здесь нужны три переменные.

0 голосов
/ 17 сентября 2010

Хорошо, благодаря 2 ответам, приведенным выше, вот то, что сейчас выглядит хорошо:

#include <stdio.h>    
#include <stdlib.h> 
#include <string.h>

char *strtrim_right(char *p)
{
  char *end;
  int len;
  len = strlen( p);
  while (*p && len)
    {
    end = p + len-1;
    if(isalpha(*end))
     *end =0;
   else 
    break;
len = strlen(p);
    }
  return(p);
}


int main ()  
{  
  char x[]="PM123BFD";
  strtrim_right(x);
  printf("%s", x);
  return 0;
}  
...