我正在尝试创建一个计算字符串中元音的程序。打印vowelsInString时,所有值都保持为零。
#include <stdio.h>
#include <stdlib.h>
void printfArray(int array[]);
int main()
{
char stringToTest[] = {}, vowels[5] = {'a', 'e', 'i', 'o', 'u'};
int i, j, numOfVowels, vowelsInString[5] = {0, 0, 0, 0, 0};
numOfVowels = 0;
printf("Enter: ");
scanf("%c", &stringToTest);
for(i=0; i<sizeof(stringToTest); i++)
{
for(j=0; j<sizeof(vowels); j++)
{
if(stringToTest[i] == vowels[j])
{
numOfVowels++;
vowelsInString[j]++;
printf("%d",vowelsInString[j]);
}
}
}
printfArray(vowelsInString);
}
void printfArray(int array[])
{
int i;
for(i=0; i<=sizeof(array); i++)
{
printf("%d\n", array[i]);
}
}
看起来它不符合第20行的if语句。为什么?
if(stringToTest[i] == vowels[j])
答案 0 :(得分:2)
您的程序无效的原因是您声明stringToTest
:
char stringToTest[] = {}; // This is not standard C
此声明是一个C扩展,它创建一个零长度数组。当你稍后使用它的大小时,你得到零(demo),所以程序永远不会进入循环。
要解决此问题,请将stringToTest
分配给某个最大尺寸,然后使用%s
而不是%c
阅读:
char stringToTest[100];
...
scanf("%99s", stringToTest);
使用strlen
代替sizeof
来获取最终用户输入的字词的实际长度:
size_t len = strlen(stringToTest);
for(i=0; i<len; i++)
...
printfArray
也需要修复,因为sizeof(array)
会返回系统上指针的大小。 “修复”您尝试的方式,<=
循环中的for
而不是正确的<
“工作”,因为数组的大小为5。您应该从main
传递大小,如下所示:
void printfArray(int array[], size_t len) {
for (size_t i = 0 ; i != len ; i++) {
...
}
}
答案 1 :(得分:0)
由于您已经对即时问题有了很好的答案,如果您考虑将元音定义为常量,您可以稍微缩短代码,同时使该过程更具可读性。虽然将元音保持在数组中进行测试没有任何问题,但将元音指定为常量,并结合短switch
提供了另一种方法。 (如果愿意,您可以分开和跟踪大/小写元音)。一个快速的替代实现,它将字符串作为第一个参数进行测试("alligator"
作为默认示例,如果没有给出字符串)可以是:
#include <stdio.h>
enum { a, e, i, o, u }; /* these become global constants, don't reuse */
int main (int argc, char **argv) {
char *st = argc > 1 ? argv[1] : "alligator", *p = st;
unsigned vowels[5] = {0}, sum = 0;
for (; *p; p++) { /* for each char in st, convert to lower */
char c = ('A' <= *p && *p <= 'Z') ? *p | (1 << 5) : *p;
switch (c) {
case 'a' : vowels[a]++; break; /* increment vowels */
case 'e' : vowels[e]++; break;
case 'i' : vowels[i]++; break;
case 'o' : vowels[o]++; break;
case 'u' : vowels[u]++; break;
}
}
/* get total and print */
sum = vowels[a] + vowels[e] + vowels[i] + vowels[o] + vowels[u];
printf ("\n vowels in '%s'\n\n a or A : %2u\n e or E : %2u\n i or I : %2u\n"
" o or O : %2u\n u or U : %2u\n -----------\n total %2u\n", st,
vowels[a], vowels[e], vowels[i], vowels[o], vowels[u], sum);
return 0;
}
示例使用/输出
$ ./bin/vc "The quick brown fox jumps over a lazy dog."
vowels in 'The quick brown fox jumps over a lazy dog.'
a or A : 2
e or E : 2
i or I : 1
o or O : 4
u or U : 2
-----------
total 11
skin-the-cat 的另一种方式。仔细看看,如果您有任何问题,请告诉我。