我正在尝试制作一个程序,它将输入一个字符串并用*符号替换所有元音。因此,对于“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;
}
}
答案 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;
}