gpt4 book ai didi

c - 删除 C 中的尾随空格

转载 作者:行者123 更新时间:2023-11-30 14:46:05 25 4
gpt4 key购买 nike

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

字符串是函数的输入。

//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 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对于这个想法。

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

(之后不要忘记 free() 结果!)

关于c - 删除 C 中的尾随空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52569955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com