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

标签 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;

}

最佳答案

Why is my code outputting random numbers even though they are just counts?

因为根据您发布的代码,您正在计算未初始化内存。

这是未初始化的:

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”进行比较。其中每最后 100 亿个左右,其中许多(如果不是大多数)都可能包含未知值。

它还会检查 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] 时结束其值为零。

关于c - 为什么我的代码输出随机数,即使它们只是计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46142076/

相关文章:

command-line - FitNesse/Gradle命令行输出到文件中

powershell - 将三个命令的输出减少到一行

C 编译器损坏 : is not able to compile a simple test program

c - while 循环,从 scanf 读取 int 与 char,true 和 false

c - 匿名函数返回动态分配的值

c - printf 语句中的额外输出行

java - boolean 值不能同时工作

c# - 从静态函数访问外部变量

Python:在特殊环境中执行代码对象

c - 插入到链表的开头(重新访问)