c - 删除 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 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的想法。
这不是一个好方法的原因是您希望函数的调用者始终提供可写字符串,并且您将修改它们。通常,返回重复项的函数是一种更好的方法。
(不要忘记之后释放()结果!)
推荐阅读
- javascript - 事件侦听器即使在 chrome 上也不起作用?
- python - 无法使用 Selenium 提交 drupal 菜单添加表单
- docker - Kubernetes 中的 IBM MQ 统一集群
- sql - 找不到解决三张表和连接操作相关问题的方法
- java - curl --cert 使用了错误的证书
- javascript - setTimout() ajax 请求不成功
- cin - 为什么在我写入并关闭该文件后我不能从该文件中读取?
- bazel - Bazel 是否支持枚举传递依赖项和依赖项存储库位置?
- elasticsearch - 如何过滤来自请求正文而不是请求 url 的 elasticsearch 响应?
- c# - 如何使用 c# Litedb (noSQL) 更改数据库位置?