为什么不打印任何输出? (C语言)

时间:2018-09-02 05:55:16

标签: c

不确定为什么什么都不会出现,编译器没有发现错误,它只是运行并在几秒钟后终止,没有输出。

我将提供源代码和输入文件的文本。

源代码: 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以及一般而言,我还是一个新手。任何帮助将不胜感激。

1 个答案:

答案 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

无论哪种情况,代码都应在没有警告的情况下编译。