繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM