我想用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'等。我试着给* dst分配NULL,但是我在编译时遇到了错误。
我现在如何删除'a'字符?
答案 0 :(得分:2)
在C中,字符串以零结尾,这意味着当字符串中有'\0'
时,字符串的结尾。
所以你正在做的是将字符串分成3个不同的字符串:
p
stern
k
如果您要删除a
,则必须移动a
一个位置后的所有字符。
答案 1 :(得分:1)
printf的作用是:读取字节直到找到'\0'
。
您已将"pasternak"
转换为"p\0astern\0k"
,因此printf会打印p
。
此约定用于stdlib的字符串函数,因此您不必将字符串长度作为参数传递。
这就是为什么说C字符串是空终止的:它只是C stdlib后面的约定。
正如您所发现的,缺点是字符串不能包含\0
。
如果您确实要打印给定数量的字节,请使用fwrite
之类的内容,它会计算要打印的字节数,因此可以打印\0
。
答案 2 :(得分:0)
之前提供的答案非常适合解释您的代码无效的原因。但是您可以尝试使用strtok基于'a'字符拆分字符串,然后将这些部分连接在一起或者只是打印它们。请查看此示例:http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
答案 3 :(得分:-2)
'\0'
是C语言工具识别字符串结尾的方式。为了实际删除一个角色,你需要将所有后续角色向前移动。
void sos(char *dst) {
int offset = 0;
do {
while (dst[offset] == 'a') ++offset;
*dst = dst[offset];
} while (*dst++);
}