移除字符串末尾的空终止符

3

我正在尝试从输入中扫描一个字符,我已经尝试了所有方法,包括scanf() getline() fgets(),但它们都在末尾包含不需要的空终止符'\0'。如何去除它?我已经尝试过

char *p=strtok(string,'\0\')

但它没有奏效。我该怎么办? 我正在使用getline()将字符串扫描到字符串数组中,这很好用。我想输入一个“needle”,并尝试使用getline()扫描它,然后使用strstr查找匹配项,但是'\0'导致无法匹配


4
你想达到什么目标? - ouah
1
通常情况下,您不应该从字符串中删除空终止字符。如果您这样做,并将该字符串传递给string.h中的任何函数(以及其他一些库中的函数),程序将崩溃。 - Tony Ruth
1
我需要去掉它,因为我想将这个字符串作为needle在strstr()中使用,而且只有带'\0'才能匹配字符串的末尾。 - Abdir
4
请说明您的其他问题,因为我认为您正在错误地尝试修复它。在使用C语言中的字符串时,需要使用空字符终止符来确定字符串的结尾位置。 - lurker
1
@Abdir:C语言中的字符串总是包含'\0'字符,因为这个字符标志着字符串的结尾。所以,当操作字符串的函数读取到这个字符时,它们就知道已经到达了字符串的结尾。在'\0'之前的所有内容都是字符串的内容。你使用strstr不会有任何问题;它并不只匹配字符串的结尾。 - Xaver
显示剩余6条评论
3个回答

3
您想知道如何从字符串末尾移除NUL终止符。您可以通过用其他字符(例如字母'a')覆盖它来实现:
str[strlen(str)] = 'a';

请注意,C语言没有办法“删除”数组中的元素(包括字符串,它是一个char数组);数组元素始终存在(直到整个数组被销毁),它们只能被其他值覆盖。

2
C使用以null结尾的字符串,这意味着所有旨在处理“字符串”的库函数都会给你一个以null结尾的字符数组,并期望得到同样的数组作为输入。
您可以将字符串中除了null终止符之外的所有字节复制到一个新的字符数组中:
char buffer[strlen(string)];
memcpy(buffer, string, strlen(string));
p* = buffer;

注意:strlen 函数在字符计数时不包括空字符。
但是,如果您将 p* 作为参数传递给期望字符串的函数,则可能会在运行时遇到问题。您已被警告 :)

在C语言中,数组必须有固定的大小,除非它们使用malloc在堆上分配空间。第一行会抛出一个错误。 - qleguennec
1
@qleguennec 这段代码片段旨在用于函数内部,如果您使用的是C99标准,则可以在函数内定义变量长度数组。 - DonComo
1
@qleguennec 声明数组或变量仍然是“代码”,这可以在函数外部完成。我的代码片段显然不能在函数外部工作,但当我写下那个注释时,我想到了这一行 char buffer[strlen(string)]; - DonComo

0
你可以使用带有字符串大小的srncpy函数来删除字符串末尾的'\0'。
char test[] = "example";
char *result;

result = malloc(sizeof(char) * strlen(test));
strncpy(result, test, strlen(test));

但是我不确定这是否是您真正想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接