我试图修剪ANSI C字符串的结尾,但它使seg在trim
函数上出错。
#include <stdio.h>
#include <string.h>
void trim (char *s)
{
int i;
while (isspace (*s)) s++; // skip left side white spaces
for (i = strlen (s) - 1; (isspace (s[i])); i--) ; // skip right side white spaces
s[i + 1] = '\0';
printf ("%s\n", s);
}
int main(void) {
char *str = "Hello World ";
printf(trim(str));
}
我不知道为什么,我试了15个不同的trim
函数,它们都是segfaulting。
3条答案
按热度按时间qacovj5a1#
trim
函数很好,main
中有两个错误:1.str
是一个字符串文字,应该修改。2.对printf
的调用是错误的,因为trim
没有返回任何东西。cotxawn72#
您正在尝试修改
str
指向的字符串文字"Hello World"
,这会导致seg错误。在
main
中,使str
成为一个数组:或
malloc
它:虽然
"Hello World "
的类型为char []
,但它存储在只读缓冲区中。检查输出here。此外,printf(trim(str));
也没有意义,因为您没有从trim
函数返回任何内容。5vf7fwbs3#
在
char* str = "Hello world "
中,字符串"Hello World "
存储在只读地址空间中。试图修改只读存储器会导致未定义的行为。改为使用
char str[] = "Hello World ";
或
然后尝试微调功能
有关如何为变量分配内存的更多信息,请参阅https://stackoverflow.com/a/18479996/1323404