我想在ANSI C中替换字符串中的所有'a'字符。下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
void sos(char *dst){
while(*dst){
if(*dst == 'a')
*dst = '\0';
dst++;
}
}
int main(void){
char str[20] = "pasternak";
sos(str);
printf("str2 = %s \n", str);
return 0;
}
当我运行它时,结果是:
str2 = p
但应该是
str2 = psternk
它可以很好地处理其他字符,如'B'等。我试图将NULL分配给 *dst,但在编译过程中出错。
现在如何删除“a”字符?
4条答案
按热度按时间nnsrf1az1#
在C中,字符串是零终止的,这意味着当字符串中有
'\0'
时,它是字符串的结尾。所以你要做的就是把字符串分成3个不同的部分:
如果要删除
a
,则必须将a
之后的所有字符移动一个位置。drnojrws2#
printf做的是:读取字节,直到找到
'\0'
。您将
"pasternak"
转换为"p\0astern\0k"
,因此printf将打印p
。此约定用于stdlib的字符串函数,这样您就不必将字符串长度作为参数传递。
这就是为什么说在C中字符串是null终止的:它只是C stdlib遵循的一个约定。
正如您所发现的,缺点是字符串不能包含
\0
。如果你真的想打印一个给定的字节数,使用类似
fwrite
的东西,它计算要打印的字节数,所以它可以打印一个\0
。wd2eg0qa3#
前面提供的答案很好地解释了为什么你的代码不能工作。但是你可以尝试使用strtok根据'a'字符分割字符串,然后将部分连接在一起或简单地打印它们。检查这个例子:http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
lyfkaqu14#
'\0'
是C语言工具识别字符串结尾的方式。为了实际删除一个字符,您需要将所有后续字符向前移动。