删除C中的尾随空格

时间:2018-09-29 15:41:55

标签: c

我正在尝试删除尾随空格,但是我一直遇到分段错误。不太确定我在哪里访问内存,但这是我的代码。前导空格很好用。

字符串是函数的输入。

//remove leading spaces
char* final = string;
while(isspace((unsigned char)final[0]))
        final++;

 //removing trailing spaces
//getting segmentation fault here
    int length = strlen(final);
    while(length > 0 && isspace((unsigned char)final[length-1]))
            length--;
    final[length-1] = '\0';

我测试的字符串是

char* word = "  1 2 Hello    ";
printf("%s\n", removeSpaces(word));

当我注释掉尾随空格时,它可以完美工作。我不明白为什么代码在尾部空格处失败。我真的很感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

字符串文字" 1 2 Hello "存储在只读存储器中。在尝试向其中写入“ \ 0”之前,先将其复制,然后该问题将消失。因此,例如,只需将其替换:

char* final = string;

与此:

char* final = strdup(string);

编辑1:在更详细地考虑这一点之后,我意识到您还可以在进行尾部修剪之前进行前部修剪。由于您正在移动指针,因此分配需要在前修剪后的 之后进行,否则调用者将无法释放内存。这是一个完整的解决方案,应该没有任何错误:

char *removeSpaces(const char *string) {

    while(isspace((unsigned char)string[0]))
        string++;
    char *final = strdup(string);
    int length = strlen(final);
    while(length > 0 && isspace((unsigned char)final[length-1]))
        length--;
    final[length-1] = '\0';
    return final;
}

编辑2:虽然在这种情况下我不建议这样做,但要知道如果变量是这样声明的,则可能会很有用:

char word[] = "  1 2 Hello    ";

它应该在可写的内存中,并且该问题也将不存在。感谢pmg的想法。

之所以使用此方法不是一个好的方法,是因为您希望函数的调用者始终提供可写的字符串,并且您将对其进行修改。通常,返回重复项的函数是一种更好的方法。

(不要忘了以后释放()结果!)