C语言 是否从字符串末尾删除字符?

xxe27gdn  于 2023-03-29  发布在  其他
关注(0)|答案(3)|浏览(135)

我试图修剪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。

qacovj5a

qacovj5a1#

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

int main(void) {
    char str[] = "Hello World     ";
    trim(str);
    printf("%s\n", str);
}
cotxawn7

cotxawn72#

您正在尝试修改str指向的字符串文字"Hello World",这会导致seg错误。
main中,使str成为一个数组:

char str[] = "Hello World     ";

malloc它:

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

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

5vf7fwbs

5vf7fwbs3#

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

相关问题