我的任务是打印由“非元音,元音,非元音”组成的单词列表,即bab,bac,bad,bad ......到zuz。
我设法创建了一个代码,该代码执行前两个字母但在最后一个循环中丢失并仅打印'}' - 这对我来说似乎很奇怪。代码如下:
#include <stdio.h>
#include <string.h>
int check_vowel(char c);
int check_consonant(char c);
int main ()
{
char c, c2, c3;
int cnt;
for (cnt = 0; cnt <= c; cnt++)
{
for (c = 'a'; c <= 'z'; c++)
{
if (check_vowel(c) == 0)
{
for (c2 = 'a'; c2 <= 'z'; c2++)
{
if (check_consonant(c2) == 0)
{
for (c3 = 'a'; c3 <= 'z'; c3++);
{
if (check_vowel(c3) == 0)
{
cnt++;
printf("%d || %c%c%c\n", cnt, c, c2, c3);
}
}
}
}
}
}
}
printf("Total names = %d", cnt);
return 0;
}
int check_vowel(char c)
{
switch(c)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return 1;
default:
return 0;
}
}
int check_consonant(char c)
{
switch(c)
{
case 'b':
case 'c':
case 'd':
case 'f':
case 'g':
case 'h':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z':
return 1;
default:
return 0;
}
}
输出结果如下:
1 || ba}
2 || be}
etc
答案 0 :(得分:5)
第一个错误就在这一行:
for (c3 = 'a'; c3 <= 'z'; c3++);
由于该行末尾的分号,迭代正文是&#34;什么都不做&#34;。它之后的代码块(从{
到}
)在此循环之后被视为要做的事情。当您输入此代码块时,c3
始终为{
,因为它是z
之后的第一个字符(在大多数字符编码中)。 修复:删除分号。
第二个错误在于条件的选择。条件check_vowel(c3) == 0
(你所写的)不等于check_consonant(c3) == 1
(你想要的)。例如,{
不是元音,但并不能使它成为辅音。 修复:让您的条件变得正面。
答案 1 :(得分:0)
为什么不尝试仅针对正确的集合进行迭代:
static const char cons[] = "bcdfghjklmnpqrstvwxyz";
static const size_t cons_sz = sizeof cons - 1;
static const char vowels[] = "aeiou";
static const size_t vowels_sz = sizeof vowels - 1;
for (i = 0; i < cons_sz; i++)
for (j = 0; j < vowels_sz; j++)
for (k = 0; k < cons_sz; k++)
printf("%c%c%c\n", cons[i], vowels[j], cons[k]);