您能帮我找到这个基本C代码的问题吗

问题描述

我正在解决一本C编程书籍中的一些问题,以复习Strings。我不知道为什么我的解决方案无法正常工作。

问题要求编写一个名为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 != '\0') {
        if (*c == 'f' && *(c+1) == 'o' && *(c+2) == 'o')
            *c = *(c+1) = *(c+2) = 'x';
        c++;
    }
}

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

解决方法

您要检查 pointer 的值,而不是它指向的值。所以代替这个:

/home/pj/twittAnestProj/data.csv

您想要这个:

while (c+2 != '\0') {
,

如果我已正确理解,您可能尚未使用标准的C字符串函数,而函数censor应该使用指针编写。

对于初学者来说,这样的字符串函数应返回一个指向修改后的字符串的指针。也就是说,函数返回类型应为char *而不是void

while循环中的条件

while (c+2 != '\0') {

等同于

while (c+2 != NULL) {

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

此外,如果您甚至会更改条件,例如

while ( *( c+2 ) != '\0') {

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

可以定义该功能,如下面的演示程序所示。

#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 == '\0' )
        {
            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可以用长度相等的任何其他字符串初始化。