我正在尝试修剪ANSI C字符串的结尾,但它会在trim
函数上保留seg faulting。
#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
函数,它们都是分段错误。
答案 0 :(得分:2)
trim
函数很好,main
中有两个错误:1。str
是一个字符串文字,应该修改。 2.对printf
的调用是错误的,因为trim
不会返回任何内容。
int main(void) {
char str[] = "Hello World ";
trim(str);
printf("%s\n", str);
}
答案 1 :(得分:1)
您正在尝试修改由"Hello World"
指向的字符串文字str
,这会导致seg错误。
在main
制作str
数组:
char str[] = "Hello World ";
或malloc
:
char *str = malloc(sizeof("Hello World ")+1);
虽然"Hello World "
具有类型char []
,但它存储在只读缓冲区中。检查输出here。此printf(trim(str));
也没有意义,因为您没有从trim
函数返回任何内容。
答案 2 :(得分:0)
在char* str = "Hello world "
中,字符串"Hello World "
存储在地址空间的只读中。尝试修改只读内存会导致未定义的行为。
改为使用
char str[] = "Hello World ";
或
char *str = malloc(sizeof("Hello World ")+1);
strcpy(str, "Hello World ");
然后尝试修剪功能...
有关如何为变量分配内存的更多信息,请参阅https://stackoverflow.com/a/18479996/1323404