如何在ANSI C中用NULL替换字符串中的字符?

时间:2013-11-17 14:01:44

标签: c string pointers ansi

我想用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'字符?

4 个答案:

答案 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++);
}