2010-11-22 88 views
4

我想制作一个程序,将输入一个字符串并用*符号替换所有元音。所以,对于“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

那么你的问题到底是什么? – cdhowie 2010-11-22 08:13:31

+0

1。这是一个很好的方法去做它 – 2010-11-22 08:18:28

+0

2.如果是,那么代码有什么问题,所以我不能运行它来执行它所需要的 – 2010-11-22 08:19:04

回答

6

这段代码有许多事情错。

1)while (s[j] != '0') 我相当肯定你想要检查NUL字符,而不是字符常量零。更改'0''\0'

2)j++ 你递增j您连看都不看你的数组的第0指数之前。如果你在s [0]处有一个元音,这将被错过。将j++移动到while循环的最底部,就在结束大括号之前。

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

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

5)return 0 就像在#2中一样,您的返回语句在错误的地方。你在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; 
} 
+0

如果它的大写,你将不得不管理它。 – 2010-11-22 10:07:36

4

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

if (s[j] = 'a'

这将永远是真实的。你需要==

你还会把j++太早 - 你会跳过字符,因为你进入循环后立即增加。

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

+0

这个问题要求替换人物 - 所有想到现场的理由,尽管你提到这个问题并说明了另一个选择是很好的。 – 2010-11-22 08:39:53

相关问题