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

zc0qhyus  于 2023-03-29  发布在  其他
关注(0)|答案(4)|浏览(115)

我想在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”字符?

nnsrf1az

nnsrf1az1#

在C中,字符串是零终止的,这意味着当字符串中有'\0'时,它是字符串的结尾
所以你要做的就是把字符串分成3个不同的部分:

p
stern
k

如果要删除a,则必须将a之后的所有字符移动一个位置。

drnojrws

drnojrws2#

printf做的是:读取字节,直到找到'\0'
您将"pasternak"转换为"p\0astern\0k",因此printf将打印p
此约定用于stdlib的字符串函数,这样您就不必将字符串长度作为参数传递。
这就是为什么说在C中字符串是null终止的:它只是C stdlib遵循的一个约定。
正如您所发现的,缺点是字符串不能包含\0
如果你真的想打印一个给定的字节数,使用类似fwrite的东西,它计算要打印的字节数,所以它可以打印一个\0

wd2eg0qa

wd2eg0qa3#

前面提供的答案很好地解释了为什么你的代码不能工作。但是你可以尝试使用strtok根据'a'字符分割字符串,然后将部分连接在一起或简单地打印它们。检查这个例子:http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

lyfkaqu1

lyfkaqu14#

'\0'是C语言工具识别字符串结尾的方式。为了实际删除一个字符,您需要将所有后续字符向前移动。

void sos(char *dst) {
  int offset = 0;
  do {
    while (dst[offset] == 'a') ++offset;
    *dst = dst[offset];
  } while (*dst++);
}

相关问题