如何用其他字符替换字符串中的特定字符
我正在尝试制作一个程序,将输入一个字符串并用*符号替换所有元音。 所以,对于“你好世界”,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; } }
这段代码有很多问题。
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; }
我认为你的问题将是“一切都是*”,这是因为你的巨人的这一部分if
:
if (s[j] = 'a'
这将永远是真的。 你需要==
你也把j++
放得太早 – 你跳过字符是因为你在进入循环后立即增加。
通过在开头递增j
,您将丢失0
索引(第一个字符)。
由于您希望将新数据返回到外部世界(在函数范围之外),您可以为函数外部的新数据分配内存,并将该数据的指针传递给此函数,或者只是在此内部分配动态内存function – 记得删除它。
一种实现方式是:
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