#include <stdio.h>
#include <string.h>
int main()
{
int i;
int counter=0, counter2=0;
char *s;
char name[30];
char vowel[6] = "AEIOU";
char consonants[21] = "BCDFGHJKLMNPQRSTVWXYZ";
printf ("input the string: ");
scanf ("%s", name);
printf ("The string is %s\n", name);
for (i=0; name[i]!='\0'; i++) {
if (s = strchr(vowel, name[i])) {
counter++;
}
else if (s =strchr(consonants, name[i])) {
counter2++;
}
printf ("First counter is %d\n", counter);
printf ("The second counter is %d\n", counter2);
return 0;
}
}
问题是,我的代码出了什么问题?为什么柜台不起作用? 因为我尝试了很多方法,没有任何作用,也许有人可以为我解释。
答案 0 :(得分:10)
我已经为你的代码添加了缩进,通过这样做,很明显你的问题是你的return和print语句都在for循环中。它们应该在循环之外。
答案 1 :(得分:4)
除}
和{
展示位置问题外,consonants[21]
应为consonants[22]
。更安全的方法是使用consonants[]
- 编译器会为你计算字符数。
答案 2 :(得分:2)
最后三行是:
return 0;
}
}
但应该是:
}
return 0;
}
课程:缩进很重要。
答案 3 :(得分:2)
首先,英文字母中有21个辅音,所以你的数组应该是22个元素长(以容纳终止'\ 0'字符)。
其次,你根本不需要测试辅音,因为如果它不是元音则是辅音。所以你可以通过完全删除辅音数组来清理它,只需使用else语句而不是冗余地检查数组中的辅音。
第三,您是否打算为每个字母打印每个计数器的值?这看起来很奇怪。 此外,你应该只返回一次。目前你只进行一次循环,然后从main返回。那是不对的......你应该将你的forf循环中的printf和return语句都移动。这就是我得到的......如果你做了那些修复,你的代码应该运行。
答案 4 :(得分:0)
不要使用scanf
来读取任意长度的字符串:
#XXX never do that
char name[30];
scanf("%s", name);
如果输入大于指定的大小,则bad things可能会发生,例如正在执行的任意代码。
您可以改为使用fgets
:
char buf[BUFSIZ];
while (fgets(buf, sizeof(buf), stdin)) {
// buf contains a line or part of it;
// long lines are spread among multiple chunks
process_chunk(buf);
}
if (!feof(stdin))
; // error
应该是评论;我发布它作为包含代码示例的答案。
答案 5 :(得分:0)
很好地使用strchr
! string.h
中我最喜欢的功能之一。但是有一些注意事项:
您只检查大写字符。在将测试字符与元音列表进行比较之前,请先查看toupper()
将测试字符转换为大写字母。
如果一个字母是一个字母,并且它不是一个元音,那么它就是一个辅音。不要为辅音构建单独的数组,而是查看isalpha()
函数并考虑如何将其合并到程序中,而不是第二次调用strchr()
。现在你不必担心忘记辅音列表中的字符了!