我正在尝试删除尾随空格,但是我一直遇到分段错误。不太确定我在哪里访问内存,但这是我的代码。前导空格很好用。
字符串是函数的输入。
//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));
当我注释掉尾随空格时,它可以完美工作。我不明白为什么代码在尾部空格处失败。我真的很感谢您的帮助。
答案 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的想法。
之所以使用此方法不是一个好的方法,是因为您希望函数的调用者始终提供可写的字符串,并且您将对其进行修改。通常,返回重复项的函数是一种更好的方法。
(不要忘了以后释放()结果!)