我试图找到C中我的字符串中有多少个元音和辅音

时间:2012-03-25 23:18:17

标签: c arrays string

 #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;
   }
 }

问题是,我的代码出了什么问题?为什么柜台不起作用? 因为我尝试了很多方法,没有任何作用,也许有人可以为我解释。

6 个答案:

答案 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)

很好地使用strchrstring.h中我最喜欢的功能之一。但是有一些注意事项:

  1. 您只检查大写字符。在将测试字符与元音列表进行比较之前,请先查看toupper()将测试字符转换为大写字母。

  2. 如果一个字母是一个字母,并且它不是一个元音,那么它就是一个辅音。不要为辅音构建单独的数组,而是查看isalpha()函数并考虑如何将其合并到程序中,而不是第二次调用strchr()。现在你不必担心忘记辅音列表中的字符了!