2010-09-17 9 views
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;  
    } 
    return(p); 
} 


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

Какую ошибку? Какая линия? Какой компилятор? Какая платформа? Как вы ожидаете, что мы поможем вам, если вы не предоставите информацию? –

+1

@Alexandre Segfault – NullUserException

+1

«устаревшее преобразование из константы строки в« char * »для x; скорее используйте массив char: char x [] = ... – slashmais

ответ

11

Изменить

char *x="PM123BFD"; 

в

char x[]="PM123BFD"; 

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

5

Я не понимаю, почему он должен сломать - я предпочел бы ожидать бесконечный цикл: условие while всегда будет истинным, и цикл никогда не останется.

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

0

Ok благодаря 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; 
} 
+1

Почему strtrim_right возвращает указатель char, если вы его не используете? – jmtd

+1

с этим кодом все еще много. Условие 'while' и код внутри цикла все еще безнадежно сложны. –

+0

@jmtd: право, это возвращение должно быть удалено. – francogrex

Смежные вопросы