[英]How to replace a character in a string with NULL in ANSI C?
我想替换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”字符?
在C语言中,字符串以零结尾 ,这意味着当字符串中有'\\0'
时,它就是字符串的结尾 。
因此,您要做的就是将字符串分成3个不同的字符串:
p
stern
k
如果要删除a
,则必须将所有字符移动到a
位置之后。
printf的作用是:读取字节,直到找到'\\0'
。
您"pasternak"
转换为"p\\0astern\\0k"
,因此printf打印p
。
此约定在stdlib的字符串函数上使用,因此您不必传递字符串长度作为参数。
这就是为什么在C字符串中以null终止的原因:这只是C stdlib遵循的约定。
正如您所发现的,缺点是字符串不能包含\\0
。
如果您确实要打印给定的字节数,请使用fwrite
东西,它计算要打印的字节数,因此可以打印\\0
。
先前提供的答案非常适合解释您的代码为什么不起作用。 但是您可以尝试使用strtok根据'a'字符分割字符串,然后将各个部分连接在一起,或者只是简单地打印它们。 检查以下示例: http : //www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
'\\0'
是C语言工具识别字符串结尾的方式。 为了实际删除字符,您需要将所有后续字符向前移。
void sos(char *dst) {
int offset = 0;
do {
while (dst[offset] == 'a') ++offset;
*dst = dst[offset];
} while (*dst++);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.