0

我正在尝试修剪 ANSI C 字符串的结尾,但它一直在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的功能,它们都存在段错误。

4

3 回答 3

2

函数没问题,trim有两个错误main: 1.str是字符串文字,应该修改。2. 调用printf是错误的,因为trim没有返回任何东西。

int main(void) {
    char str[] = "Hello World     ";
    trim(str);
    printf("%s\n", str);
}
于 2013-11-12T05:16:28.093 回答
1

您正在尝试修改导致 seg 错误"Hello World"所指向的字符串文字。str

main制作str一个数组:

char str[] = "Hello World     ";

或者malloc它:

char *str = malloc(sizeof("Hello World     ")+1);

虽然"Hello World "有类型char [],但它存储在只读缓冲区中。在此处检查输出。这printf(trim(str));也没有意义,因为您没有从trim函数返回任何内容。

于 2013-11-12T05:10:53.747 回答
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

于 2013-11-12T05:26:09.860 回答