为什么我的代码输出随机数,即使它们只是计数?

时间:2017-09-10 14:58:03

标签: c output

我开始学习c。我正在尝试制作一个能够计算句子中A和A的数量的代码,但是每次执行时代码都会给我随机数,即使它是相同的句子。

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

int main()
{
    char words[10000000000];
    int i;
    int acount = 0;
    int Acount = 0;
    char A[0]="A";
    char a[0]="a";
    printf("Input your sentence to be counted.");
    scanf("%s",words);
    printf("%s",words);
    for (i=0;i<=sizeof(words);i++)
    {
        if (words[i]==a[0]){
            acount++;
        }else if (words[i]==A[0]){
            Acount++;
        }
    }
    printf ("\nThe number of A's is %i. The number of a's is %i.",Acount,acount);
    return 0;

}

1 个答案:

答案 0 :(得分:2)

  

为什么我的代码输出随机数,即使它们只是   计数?

因为你在计算未初始化的内存,所以给出你发布的代码。

这是未初始化的:

char words[10000000000];

(如果10 GB适合....)

这仅为words中的内存设置了读取的字符串以及终止'\0'字符:

scanf("%s",words);

无论如何,假设它有效。你没有检查返回值,所以也许它不起作用......

现在这个循环会做什么? (忽略int可能不足以索引10GB数组的事实......)

for (i=0;i<=sizeof(words);i++)
{
    if (words[i]==a[0]){
        acount++;
    }else if (words[i]==A[0]){
        Acount++;
    }
}

该循环将检查数组char中的每个 word,并将其与“A”或“a”进行比较。每隔10个十亿左右,其中很多(如果不是大多数)可能包含未知值。

它还会检查一个char 过去 word的结尾。这不好。这不会检查word的结尾:

size_t i;
 ...
for (i=0;i<sizeof(words);i++)
{
    if (words[i]==a[0]){
        acount++;
    }else if (words[i]==A[0]){
        Acount++;
    }
}

请注意,对<而非<=的更改,以及size_t代替i使用int

更好,所以你不要尝试计算随机数据:

size_t i;
 ...
for (i = 0; words[i]; i++) {
    if (words[i] == a[0]) {
        acount++;
    } else if (words[i] == A[0]) {
        Acount++;
    }
}

由于字符串以'\0' char值结尾,因此当words[i]的值为零时,循环将结束。