c - 从 c 中的字符串中删除尾随空格时出现分段错误
问题描述
我正在尝试删除字符串末尾的空格。我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *trim(char *str) {
char *end;
end = str + strlen(str) - 1;
while(end > str && isspace((unsigned char)*end)) {
end--;
}
*(end++) = '\0'; //this line causes the segfault
return str;
}
int main(void) {
char *str = "mystring ";
printf("before trim string is %s\n", str);
printf("length before: %d\n", strlen(str)); //should be 10
str = trim(str);
printf("after trim string is %s\n", str);
printf("length after: %d\n", strlen(str)); //should be 8
return 0;
}
当我运行代码时,出现分段错误。我不确定为什么将指针'end'增加1,然后将它指向的值从空格更改为空终止符会导致段错误。我已经读过在 C 中增加一个指针以使指针不指向数组的元素是未定义的行为。但是,“mystring”末尾的空格不仍然是 char 数组 str[] 的一部分吗?非常感谢任何帮助。
解决方案
这里的问题是导致崩溃的行正在尝试修改字符串文字,这会导致未定义的行为。
根据https://en.cppreference.com/w/c/language/string_literal,
字符串文字是不可修改的(实际上可以放在只读内存中,例如 .rodata)。如果程序试图修改由字符串文字形成的静态数组,则行为未定义。
您必须确保将 a 传递char*
给可修改的数组,例如您分配给自己的malloc()
.
推荐阅读
- excel - 计算多个日期范围内的天数而不计算重叠
- node.js - 添加索引后,MongoDB .toArray() 使用 node.js 驱动程序异常缓慢
- python-3.x - 转义格式函数中的一行
- c# - 读取 serilog 的 appconfig 文件
- java - Resteasy 3.6.3.Final on NoSuchFieldError SERVER_SENT_EVENTS_TYPE
- design-patterns - 如何通知用户使用内联编辑表单(必须编辑/保存按钮)
- android - 我无法从 android 的 firebase 数据库中获取用户数据?
- java - 如何以编程方式在 Android 上获取边框高度和宽度
- c++ - C++ getIntArrayAverage
- c++ - 在包含 hex 和 char 的 char 数组上实现 MD5 哈希