首页 > 解决方案 > 删除 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));

当我注释掉尾随空格时,它可以完美运行。我不知道为什么代码在尾随空格处失败。我非常感谢您的帮助。

标签: c

解决方案


字符串文字" 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的想法​​。

这不是一个好方法的原因是您希望函数的调用者始终提供可写字符串,并且您将修改它们。通常,返回重复项的函数是一种更好的方法。

(不要忘记之后释放()结果!)


推荐阅读