如何用其他字符替换字符串中的特定字符

时间:2010-11-22 08:10:54

标签: c

我正在尝试制作一个程序,它将输入一个字符串并用*符号替换所有元音。因此,对于“hello world”,star_vowels应返回“h * ll * w * rld”。

到目前为止我的代码是:

int star_vowels(char s[]){

    int j;

    j = 0;
    while (s[j] != '0'){
        j++;
        if (s[j] = 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){
            putchar('*');
        } else {
            putchar(j);
        }
        return 0;
    }
}

3 个答案:

答案 0 :(得分:6)

这段代码有很多问题。

1)while (s[j] != '0') 我很确定你想要检查NUL字符,而不是字符常数为零。将'0'更改为'\0'

2)j++ 在查看数组的第0个索引之前,您正在递增j。如果你在s [0]有一个元音,那就错过了。将j++移动到while循环的最底部,就在结束括号之前。

3)s[j] = 'a' 当您应该使用等于运算符=时,您正在使用赋值运算符==。使用赋值运算符是合法的C代码,因此将进行编译。不幸的是它会返回true,你最终会用星号替换所有的字符

4)putchar(j); 当你真的想要输出s [j](你的角色)时,你试图输出'j'(你的迭代器)。

5)return 0 就像在#2中一样,你的return语句位于错误的位置。你应该在while循环中,它应该之外。你编写它的方式,while循环只会在你的函数超出范围之前执行第一次迭代。

int star_vowels(char s[]) {

    int j = 0;

    while (s[j] != '\0'){
        if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u') {
            putchar('*');
        } else {
            putchar(s[j]);
        }
        j++;
    }
    return 0;
}

答案 1 :(得分:4)

我认为你的问题将是“一切都是*”,这是因为你的巨人if的这一部分:

if (s[j] = 'a'

这将永远是真的。您需要==

你也过早地放置j++ - 你会跳过字符,因为你在进入循环时会立即递增。

答案 2 :(得分:2)

通过在开头递增j,您将丢失0索引(第一个字符)。

由于您希望将新数据返回到外部世界(在函数范围之外),您可以为函数外部的新数据分配内存,并将该数据的指针传递给此函数,或者只是分配动态此函数内存 - 记得删除它。

一个实现是:

char *star_vowels(char s[]){
    // let's allocate memory for the new string.
    // its size should be strlen(s) + 1 (the ending char).
    char *final = malloc(strlen(s) + 1); 

    int j = 0;
    while (s[j] != 0){
        if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){
            final[j] = '*';
        } else {
            final[j] = s[j];
        }
        j++;
    }
    final[j] = 0; // end the string
    return final;
}

工作示例:http://codepad.org/dd2w5cuy