数组要么不打印计数,要么打印多次

时间:2017-04-10 05:23:47

标签: c arrays

这个小程序基本上应该得到用户输入,读取它是否有任何A或A并将这些计数存储到Array[]。然后打印出Array[]的计数。

#include<stdio.h>

main()
{
    int Array[100] = {0};

    int i;

    char input[100];

    printf("Enter a message:...");
    gets(input);

    for(i=0; input[i]!='\0'; i++)
    {
        if (input[i]=='a' || input[i]=='A') {Array[i]++;}   
    }

    printf("Total A's:%d\n",Array[i]);
}

来自控制台的输入/输出示例:

 Enter a message:...harry 

 Total A's:0

显然输入中有一个'a',但没有考虑。现在我尝试将printf放在for循环中,但它会输出:

Enter a message:...harry 

 Total A's:0 

 Total A's:1 

 Total A's:0 

 Total A's:0 

 Total A's:0

正在发生的事情是它显然读取了多少个字符是消息,并检查每个索引是否有一个应该这样做,但它也在每个索引打印出这个输出。

它应该只有printf ONCE.so将printf置于循环中确实有效,但用它生成“bug”

4 个答案:

答案 0 :(得分:0)

问题是

 printf("Total A's:%d\n",Array[i]);

不符合您的想法。从逻辑上看,您尝试打印的值是无用的

不是为'A''a'的每次出现增加计数,而是只增加特定索引的初始值({{ 1}})您在Array找到了匹配项。之后,您以任何方式打印索引变量的值,其值未被更改(提示:检查循环后input的值)。

显然,您不需要一个数组来保存单个变量的计数。只需使用一个普通变量,将其初始化为0并继续增加它。

答案 1 :(得分:0)

在最后一次迭代中,我等于99.然后我增加到100,所以循环结束然后你想要打印数组[100]。 该索引超出范围,因此它是未定义的行为。

正如您在评论中所说,您希望存储数组中所有字符的计数。然后根据字母表中的位置计算数组中索引的字母。

#include <ctype.h>

for(i=0; input[i]!='\0'; i++)
{
  char c = tolower(input[i]);
  if (isalpha(c))
   Array[c - 'a']++;
}

这种方式&#39; a&#39;将是索引0,&#39; b&#39; 1等

&#39;一个&#39;是一个整数值(ascii表中的97)。 &#39; B&#39;是98,c =&#39; 99&#39;所以当你有一个&#39;在一个变量中,你减去一个文字&#39; a&#39;结果= 0。&#39; b&#39; - &#39; a&#39; = 1&#39; c&#39; - &#39; a&#39; = 2等

在此处查看ascii表值:

http://www.asciitable.com/

答案 2 :(得分:0)

显然,我只需要使用另一个变量j并将printf中的索引更改为0。

#include<stdio.h>

main()
{
    int Array[100] = {0};

    int i;

    char input[100];

    printf("Enter a message:...");
    gets(input);

    for(i=0; input[i]!='\0'; i++)
    {   int j = 0;
        if (input[i]=='a' || input[i]=='A') {Array[j]++;}   
    }

    printf("Total A's:%d\n",Array[0]);
}

已解决:)

答案 3 :(得分:0)

您的问题是经典频率问题。无论何时需要计算一组值的频率,都可以使用能够保存该数量值的数组。在您的情况下,您需要知道'a''A' s出现的频率,总共2个元素(初始化为零)。

当您执行代码并测试任何一个值的出现时,您只需递增与该值对应的元素,例如

a_array[0]++;   /* when an 'a' is encountered */
a_array[1]++;   /* when an 'A' is encountered */

扫描整个字符串后,'a'的数量位于a_array[0]'A'的数量位于a_array[1]

将它们放在一起,同时将gets(您永远不会再使用)替换为fgets,您可以执行以下操作:

#include <stdio.h>
#include <string.h>

#define MAXC 256

int main (void) {

    int a_array[2] = {0};   /* if you are counting 'a's and 'A's, you need 2 */
    char buf[MAXC] = "";

    while (fgets (buf, MAXC, stdin)) /* for each line of input */
    {
        char *p = buf;
        size_t len = strlen(p);     /* get the length */

        if (buf[len-1] == '\n')     /* remove the trailing '\n' */
            buf[--len] = 0;         /* by overwriting with '\0' */

        for (; *p; p++)             /* for each char in buf */
            if (*p == 'a')          /* is it an 'a'? */
                a_array[0]++;       /* if so increment the 'a' counter */
            else if (*p == 'A')     /* if it is an 'A' */
                a_array[1]++;       /* increment the 'A' counter */

        printf ("\nthere are '%d' a's and '%d' A's in\n'%s'\n",
                a_array[0], a_array[1], buf);

        a_array[0] = a_array[1] = 0;    /* zero for next line */
    }

    return 0;
}

示例使用/输出

$ printf "my dog has A lot of fleas\nA snake has none - Amen.\n" | \
./bin/num_aAs 

there are '2' a's and '1' A's in
'my dog has A lot of fleas'

there are '2' a's and '2' A's in
'A snake has none - Amen.'

现在通常,您不会硬编码a_array[0]a_array[1],但会使用逻辑索引来保存值。例如,要计算每个字母a-z每次出现的频率(共26个字符),您可以使用:

int c_array[26] = {0};

然后在测试每个字符时,只需增加c_array[*p - 'a']++;,例如

while (fgets (buf, MAXC, stdin))     /* for each line of input */
{
    char *p = buf;
    /* trim '\n' */
    for (; *p; p++)                 /* for each char in buf */
        if ('a' <= *p && *p <= 'z')
            c_array[*p - 'a']++;
    ...

结果c_array将保留'a'c_array[0]的数量以及后续元素中的每个对应字母频率c_array[25],其中包含所有{{1}的频率1}} S上。

例如,如果您想尝试针对您的问题的逻辑索引方案,您可以使用以下顺序的东西:

'z'