计算空格和制表符程序的奇怪行为

时间:2017-04-22 12:34:56

标签: c

C代码

#include <stdio.h>

int main () 
{
    int c , nother , new , ndigits [10] , white, tabs ; 

    for ( int i = 0 ; i< 10 ; i++)
        ndigits[i] = 0 ;

    while ( (c = getchar() )!= EOF ) 
    {
        switch (c)
        {
            case '0' : case '1' : case '2' : 
            case '3' : case '4' : case '5' : 
            case '6' : case '7' :  case '8' : 
            case '9' : 
                ndigits[c- '0' ]++ ; 
                break ; 

            case ' '  : 
                printf("w");  /*to see how many spaces */
                white++ ; 

            case '\t' :
                printf("t");
                tabs++;

            case '\n' : 
                printf("n");
                new++ ; 
                break ; 

            default : 
                nother++ ; 
                break ;     
        }
    }

    printf ("digits = " ) ; 

    for ( int i = 0 ; i < 10 ; i++ ) 
        printf ("%d" , ndigits[i]) ;

    printf ( ",tabs = %d , new line = %d,  spaces = %d , other = %d ",
        tabs, white , new , nother ); 

    return 0 ;
}
  1. 当我使用GCC进行编译时,只需按Ctrl + z即可打印

    digits = 00000,tabs = 4200912,new line = 4194432,spaces = 2293540 其他= 2147307520

    这些号码来自哪里?

  2. 我再次编译并输入HELLO HELLO HELLO并单击回车 并打印wtnwtnwnn

    • 为什么(比预期的3 n,为什么它有三个标签)?

3 个答案:

答案 0 :(得分:2)

将计数器初始化为零,否则它们的初始值将是不可预测的。

int c , nother = 0 , new = 0 , ndigits [10] , white = 0, tabs = 0 ;

此外,每个case块(除了捕获数字的块)必须以break;终止,以达到预期的效果。

如果省略它们,将执行下一条指令。

white++;
break;

...

tabs++;
break;

底部注意:只要在编译器上启用警告,您就可以自己找到这些错误。这样做:你会节省很多时间来发现天真的错误。

答案 1 :(得分:2)

您的某些case缺少break个,这似乎不是您想要的。

此外,您尚未初始化nothernewwhitetabs,但仍在使用它们。这导致未定义的行为。 (任何体面的编译器都会给你一个警告。)

答案 2 :(得分:1)

有几个错误:

  1. 你只是声明变量而不是初始化它们。因此在这些变量中插入了垃圾值
  2. 由于您没有为上述声明指定中断,因此打印'n'错误。
  3. 你打印没有。空格好像行数(检查m <- structure(c(NA, 2L, 4L, NA, NA, 2L, 2L, NA, NA, 2L, 2L, NA, NA, 4L, 4L, NA), .Dim = c(4L, 4L), .Dimnames = list(c("W_1_N", "W_1_E", "W_1_C", "W_1_D"), c("a", "b", "c", "d")))
  4. 以下代码生成您需要的输出:

    printf (",tabs = %d , new line = %d,  spaces = %d , other = %d " ,tabs ,white , new, nother) ;