你能帮我找出这个基本 C 代码的问题吗

Can you help me find a problem with this basic C code

我正在解决 C 编程书中的一些问题以温习字符串。我不明白为什么我的解决方案不起作用。

问题要求编写一个名为 censor 的函数,通过将每次出现的 foo 替换为 xxx 来修改字符串。

我的代码:

int main()
{
    char msg[] = "I love food, you fool.";

    censor(msg);

    puts(msg);

    return 0;
}

void censor(char *str) {
    char *c = str;
    while (c+2 != '[=10=]') {
        if (*c == 'f' && *(c+1) == 'o' && *(c+2) == 'o')
            *c = *(c+1) = *(c+2) = 'x';
        c++;
    }
}

我发现 while 循环运行了大约 1700 次。我很确定 msg[] 会在字符串结尾自动包含一个空字符。

您正在检查 指针 的值,而不是它指向的内容。所以不是这个:

while (c+2 != '[=10=]') {

你想要这个:

while (*(c+2) != '[=11=]') {

如果我没理解错的话,您可能还没有使用标准的 C 字符串函数,函数 censor 应该使用指针编写。

对于初学者来说,这样的字符串函数应该 return 指向修改后的字符串的指针。即函数 return 类型应该是 char * 而不是 void.

while循环中的条件

while (c+2 != '[=10=]') {

等同于

while (c+2 != NULL) {

因为表达式c + 2的指针类型是char *。所以条件不正确。

此外,一般来说,如果您甚至会更改条件,例如

while ( *( c+2 ) != '[=12=]') {

如果用户将传递少于两个字符的字符串,则循环可能有未定义的行为。

函数可以定义如下面的演示程序所示。

#include <stdio.h>

char * censor( char *s ) 
{
    const char *s1 = "foo";
    const char *s2 = "xxx";
    
    for ( char *p = s; *p; )
    {
        const char *t1 = s1;
        
        while ( *t1 && *t1 == *p )
        {
            ++t1; ++p;
        }
        
        p -= t1 - s1;
        
        if ( *t1 == '[=13=]' )
        {
            for ( const char *t2 =s2; *t2; ++t2 )
            {
                *p++ = *t2;
            }
        }
        else
        {
            ++p;
        }
    }
    
    return s;
}

int main( void ) 
{
    char msg[] = "I love food, you fool.";
    
    puts( msg );
    puts( censor( msg ) );
    
    return 0;
}

程序输出为

I love food, you fool.
I love xxxd, you xxxl

所示函数的代码不依赖于字符串 "foo""xxx"。指针 s1s2 可以用任何其他长度相等的字符串进行初始化。