无法在数组中添加整数

时间:2016-07-30 03:30:01

标签: c

我正在尝试创建一个计算字符串中元音的程序。打印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])

2 个答案:

答案 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 的另一种方式。仔细看看,如果您有任何问题,请告诉我。