【问题标题】:Program to count blanks, tabs, and newlines计算空格、制表符和换行符的程序
【发布时间】:2017-06-01 23:52:44
【问题描述】:

我写的程序如下

#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)。

哪里出错了?为什么制表符算3个空格?

【问题讨论】:

  • 你为什么用double而不是整数类型
  • 输出表明你确实放了空格而不是制表符,也许检查你的程序
  • 可能是因为您的选项卡已经扩展为输入中的空格
  • 我推荐使用else if
  • 使用 double 只是意味着一旦范围达到某个点(小于 UINT64_MAX),您就会得到虚假结果

标签: c


【解决方案1】:

您的代码运行良好,但在线编译器无法正常运行,因为它使用空格而不是制表符。这是您的带有小模块的代码。

#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

【讨论】:

  • @user694733 很抱歉,我没有看到他使用在线编译器。
【解决方案2】:

以下建议的代码:

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

现在是代码:

#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;
}

使用描述的输入: (为了便于说明,&lt;tab&gt; 实际上是一个制表符)

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

这是输出:

lines = 2.000000, blanks= 2.000000, tabs=2.000000 

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多