【问题标题】:Why is my code outputting random numbers even though they are just counts?为什么我的代码输出随机数,即使它们只是计数?
【发布时间】:2017-09-10 14:58:03
【问题描述】:

我开始学习 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;

}

【问题讨论】:

  • 只是提醒一下 - 该数组将尝试分配 10GB 的内存(对于这种情况可能有点过分)。在其他新闻中,请提供mcve,让我们更好地帮助您。
  • char A[0]="A"; 是一个错误。那甚至不应该编译。
  • 你的操作系统是什么?因为我不知道默认情况下允许这么多堆栈的任何操作系统。
  • @melpomene 编译时会出现警告。
  • 您可能想阅读以下内容:How to debug small programs

标签: c output


【解决方案1】:

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

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

这是未初始化的:

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++;
    }
}

该循环将检查数组word 中的每个 char,并将其与“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++;
    }
}

注意更改为&lt; 而不是&lt;=,以及使用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] 的值为零时结束。

【讨论】:

  • i&lt;sizeof(words) --> words[i] != '\0'
  • @BLUEPIXY 谢谢。开始... ;-)
  • 要添加到 BLUEPIXY 的评论中,sizeof(words) 仍然是错误的,因为它会读取最后一个初始化字节,在 scanf() 之后我们希望将 '\0' 作为值。
  • 这个就不说了:"char A[0]="A"; char a[0]="a";" ?
  • @IharobAlAsimi 是的。但我留下了那里,因为它回答了为什么他看到随机输出值的问题 - 他正在计算随机数据。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2010-12-22
相关资源
最近更新 更多