数空格、制表符和换行的程序

3

我正在阅读《C程序设计语言》。这里有一个问题,要求编写一个程序来计算空格、制表符和换行符。现在我知道可以使用\n表示换行符,\t表示制表符,但是我第一次听说空格!空格到底是什么意思?对于换行符和制表符,我已经编译了以下程序:

#include <stdio.h>

/*  program to count blanks, tabs, and newlines */
main (){
    long blanks, tabs, newlines, input;

    blanks = 0;
    tabs = 0;
    newlines = 0;
    input = 0;
    while ((input = getchar()) != EOF)
        if (input == '\n')
            ++newlines;
        else if (input == '\t')
            ++tabs;

    printf("Total newlines: %ld\nTotal Tabs: %ld", newlines, tabs);
}

一个空白通常只是一个空格字符(' ')。 - Jerry Coffin
在C中,空白通常用“ ”表示 - squiguy
1
squiguy," "表示一个以空字符结尾的字符数组。你的意思是' '。 - Josh
8个回答

6

blanks = 空格 (' ')

虽然你的代码可以运行,但我强烈建议在 while 循环体中添加 { }


1
@Jerry:普通程序员会很高兴在那些“if”后面添加一个缩进的行……是的,这是一件愚蠢的事情。但它确实会发生。编码标准是为了普通人而设定的。如果你是专业人士(我相信你有132k的声望),并且如果它有意义,你可以自由地弯曲规则,只要没有初学者会接触你的代码。只是不要强迫别人使用你的风格。 - Karoly Horvath
@Adriano:你似乎(故意?)忽略了“误解更为普遍”的部分。 - Jerry Coffin
@JerryCoffin,但我说的是程序员而不是工具。当然,我不想为 while (IsEnabled) DoSomething(); 再加上额外的大括号,但如果代码块再次被“缩进”,我会这样做。 - Adriano Repetti
@Adriano:我已经找过了。大多数其他人似乎都指向MISRA,但MISRA的“来源”似乎是“因为我们认为这是一个好主意。”另请参阅Les Hatton的批评的第7页和第10页。他将此规则显示为MISRA-C中所有约150个规则中排名第六的“最嘈杂”(即最有可能是误报),而尝试修复“错误”的范围更大,更容易引入错误而不是修复任何东西。 - Jerry Coffin
@JerryCoffin,无论如何,这是一个不错的链接,我会花时间好好阅读它! - Adriano Repetti
显示剩余14条评论

0

我认为空白是指连续两个换行符

        #include<stdio.h>
        int main()
        {
            int c,nl,nb,nt;
            nl = 0;
            nb = 0;
            nt = 0;
            int flag =1;

            while((c = getchar()) != EOF){
                if(c == '\n')
                {
                    ++nl;
                    if(flag)
                    ++nb;
                    flag = 1;  
                }
                else
                flag = 0;     

                if(c == '\t')
                ++nt;     
            }
            printf("lines : %d, tabs: %d, blanks: %d", nl, nt, nb);     

            return 0;
        }

0

请查看下面的代码,这将为您的完整问题提供解决方案。

#include <stdio.h>

/* Count blank, tabs, and new lines */

main ()
{
    long c, b, t, l;    /* c for characters, b for blanks, t for tabs, l for lines */

    b = 0;
    t = 0;
    l = 0;

    while ( ( c = getchar() ) != EOF )
    {

        if ( c == '\n')
        ++l;
        if ( c == '\t')
        ++t;
        if ( c == ' ')
        ++b;
    }

    printf ("\n No of blanks : %d \n", b);
    printf ("\n No of tabs : %d \n", t);
    printf ("\n No lines in input: %d \n", l);
}

0

空白通常只是一个空格。你应该考虑使用isblank()函数来帮助分类。


3
从未听说过 isblank,也许你的意思是 isspace?如果你使用它,需要注意顺序,因为它会将换行符和制表符都视为“空格”。 - Jerry Coffin

0

0
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("Type and Press Enter. CTRL-Z for EOF:\n");
int c;
int b = 0;
int t = 0;
int nl = 0;

while((c = getchar())!=EOF){

    putchar(c);
    if(c=='\t')
        ++t;

    if(c==' ')
        ++b;
    if(c=='\n')
        ++nl

}

printf("\n%d and %d\n",b,t,nl);


return 0;

}

您在此添加了一个不必要的else if,因为我们需要知道所有3个值。


0

这个答案——受益于其他用户的贡献——仅使用了练习1-8所教授的材料。当按下Ctrl+z键(我使用的是Windows DOS),程序跳转到printf语句,打印答案,然后退出到DOS提示符。

#include <stdio.h>

/* Exercise 1-8.  Write a program to count blanks, tabs, and newlines. */
int main()
{
    int bl, tb, nl, c;

    bl = 0;
    tb = 0;
    nl = 0;
    while ((c = getchar()) != EOF) {
        if (c == ' ')
            ++bl;
        if (c == '\t');
            ++tb;
        if (c == '\n');
            ++nl;
        }
    printf("Total blanks: %d\n", bl);
    printf("Total tabs: %d\n", tb);
    printf("Total newlines: %d\n", nl);
}

当你按下回车键5次,按下空格键2次,再按下Tab键4次,然后按下Ctrl+z键,你将会得到:

总空格数:2 总制表符数:4 总换行符数:5

然后是DOS提示符。


0

我认为的解决方案是:

#include <stdio.h>
main() {
    int c, nl, nt, nb;

    nl = 0;
    nt = 0;
    nb = 0;


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

        if (c == '\t')
            ++nt;

        if (c == ' ')
            ++nb;
        }    

    printf("Blanks: %d\nNewlines: %d\nTabs: %d\n", nl, nt, nb);  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接