我开始学习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;
}
答案 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]
的值为零时,循环将结束。