不确定为什么什么都不会出现,编译器没有发现错误,它只是运行并在几秒钟后终止,没有输出。
我将提供源代码和输入文件的文本。
源代码: letterArray.c
#include <stdio.h>
/* displays a histogram of the frequencies
of letters in input */
main()
{
int c, i, nwhite, nother;
int nletter[26];
nwhite = nother = 0;
for (i = 0; i < 26; ++i)
nletter[i] = 0;
while ((c = getchar()) != EOF)
if (c == 'a' || c == 'b' || c ==
'c' || c == 'd' || c == 'e' || c == 'f' ||
c == 'g' || c == 'h' || c == 'i' || c ==
'j' || c == 'k' || c == 'l' || c == 'm' ||
c == 'n' || c == 'o' || c == 'p' || c ==
'q' || c == 'r' || c == 's' || c == 't' ||
c == 'u' || c == 'v' || c == 'w' || c ==
'x' || c == 'y' || c == 'z')
++nletter[c];
else if (c == ' ' || c == '\n' || c
== '\t')
++nwhite;
else
++nother;
printf("Letter: a b c d e f g h i j
k l m n o p q r s t u v w x y z
\nOccurences:");
for (i = 0; i < 26; ++i)
printf(" %d", nletter[i]);
printf("\nwhite space = %d, other =
%d\n", nwhite, nother);
}
文本输入:input.txt
abcdefg hijklmnop qrstuv wxyzz
对于c以及一般而言,我还是一个新手。任何帮助将不胜感激。
答案 0 :(得分:1)
您的编译器应警告您nletter
数组的索引将超出范围,这将调用未定义行为。.
导致您写超出nletter
范围的问题是无法确保使用的索引运行0-25
。具体来说,您尝试:
++nletter[c];
其中c
将包含'a' - 'z'
(或97 - 122
)中的ASCII值,请参见:ASCIItable.com。这远高于您声明0 - 25
所产生的可用可用索引(int nletter[26];
)(回想一下,数组从0
到{{1}的索引})。
为防止超出数组范围写入,您需要规范化索引,以使n-1
对应于'a'
,而0
对应于'z'
。您只需从25
的值中减去'a'
,例如
c
尽管我在这里更喜欢后递增运算符,所以:
++nletter[c - 'a'];
(增量运算符的选择是您自己的-结果相同)
将其全部放入,并按照下面的注释中所述进行一些清理,您可以执行以下操作:
nletter[c - 'a']++;
(注意:,您可以通过包含#include <stdio.h>
int main (void) /* main() is a function that return type int */
{
int c, i, nwhite, nother;
int nletter[26] = {0}; /* {0} will initialize nletter */
nwhite = nother = 0;
while ((c = getchar()) != EOF) {
if ('a' <= c && c <= 'z')
nletter[c - 'a']++; /* you want indexes from 0-25 */
else if (c == ' ' || c == '\n' || c== '\t')
nwhite++;
else
nother++;
}
printf ("Letter: a b c d e f g h i j k "
"l m n o p q r s t u v w x y z\n"
"Occurences:");
for (i = 0; i < 26; ++i)
printf ("%2d", nletter[i]); /* use the field-width modifier to */
/* insure output of 2 spaces per-int */
printf("\nwhite space = %d, other = %d\n", nwhite, nother);
return 0;
}
并选中ctype.h
代替islower(c)
并使用'a' <= c && c <= 'z'
代替{{1 }},但是由于您的问题没有指定您是否可以使用isspace(c)
以外的任何内容,因此我保留了手动检查的位置。)
使用/输出示例
c == ' ' || c == '\n' || c== '\t'
(如果在Windows上进行测试,请省略引号,否则您将看到stdio.h
)
如果您刚刚入门,请始终使用“ 启用警告的”进行编译,并阅读并修复所有警告-在干净编译之前不接受代码-警告。在您数小时不知所措之前,这将解决大多数问题。对于gcc / clang,这意味着至少要在编译字符串中添加 $ echo "abcdefg hijklmnop qrstuv wxyzz" | ./bin/letterfreq
Letter: a b c d e f g h i j k l m n o p q r s t u v w x y z
Occurences: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
white space = 4, other = 0
(您可以再添加other = 2
,再添加-Wall -Wextra
很有帮助)。对于VS,请使用-pedantic
-VS的-Wshadow
包含许多与代码无关的建议作为警告。
此代码的编译字符串如下所示:
gcc
/W3
VS
/Wall
无论哪种情况,代码都应在没有警告的情况下编译。