修剪字符串末尾的字符?

时间:2013-11-12 05:09:37

标签: c string ansi

我正在尝试修剪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函数,它们都是分段错误。

3 个答案:

答案 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