我编写的程序如下
#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个空格?
答案 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)
以下提议的代码:
switch()
语句而不是if()
语句字符串(这意味着整数只被评估一次)double
文字而不是整数文字现在是代码:
#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