计算空白,制表符和换行符的程序

时间:2017-06-01 06:59:57

标签: c

我编写的程序如下

#include<stdio.h>

int main() {

double nl=0,nb=0,nt=0;
int c;

while((c=getchar())!=EOF) {
        if(c == '\n') nl++;
        if(c == ' ') nb++;
        if(c == '\t') nt++;
}

printf("lines = %f, blanks= %f, tabs=%f ",nl,nb,nt);
return 0;

}

输入:

h   a i
i   am krishna

输出:

lines = 1.000000, blanks= 8.000000, tabs=0.000000 

在输入中,我提供了两个标签(h后面的第一行中有一个,i后面的第二行中另一个),每个标签一般包含3个空格。如果我们观察输出,它会显示1个新行(正确),8个空格(不正确,必须为2)和0个标签(假,必须为2)。

哪里出错了?为什么tab被计为3个空格?

2 个答案:

答案 0 :(得分:1)

您的代码工作正常,但在线编译器无法正常工作,因为它使用空格而不是制表符。这是你的代码,有很少的mod。

#include<stdio.h>

int main() {
/*Double has no sense*/
int nl=0,nb=0,nt=0;
int c;
while((c=getchar())!=EOF) {
        if(c == '\n') nl++;
        if(c == '\t') nt++;
        if(c == ' ') nb++;      
}

printf("lines = %d, blanks= %d, tabs=%d ",nl,nb,nt);
return 0;
}

提供此输入:

a   b c /*New line here*/
d   e f /*No new line*/

输出正确:

lines = 1, blanks= 2, tabs=2

答案 1 :(得分:1)

以下提议的代码:

  1. 干净地编译
  2. 使用switch()语句而不是if()语句字符串(这意味着整数只被评估一次)
  3. 正确使用double文字而不是整数文字
  4. 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
  5. 现在是代码:

    #include<stdio.h>
    
    int main( void )
    {
    
        double nl=0.0;
        double nb=0.0;
        double nt=0.0;
        int c;
    
        while((c=getchar())!=EOF)
        {
            switch(c)
            {
                case '\n':
                   nl += 1.0;
                   break;
    
                case ' ':
                   nb += 1.0;
                   break;
    
                case '\t':
                   nt += 1.0;
                   break;
    
                default:
                   break;
            }
        }
    
        printf("lines = %f, blanks= %f, tabs=%f ",nl,nb,nt);
        return 0;
    }
    

    描述输入: (为了便于说明,<tab>实际上是制表符)

    h<tab>a i
    i<tab>am krishna
    

    这是输出:

    lines = 2.000000, blanks= 2.000000, tabs=2.000000