计算空白,制表符和新行

时间:2017-02-14 21:01:42

标签: c character

我是C语言的新手,有人可以帮助确定我在实现计算空白,制表符和换行符的程序时遇到了什么错误。

代码:

#include <stdio.h>
//Write a program to count blanks, tabs, and newlines.
int main(){
    char str[100];
    printf("Enter the text");
    scanf("%s",&str);
    int space=0;
    int tabs=0;
    int newLine=0;
    int i=0;
    while(str[i]!='\0'){
        if (str[i] == ' ')
            space++;
        if (str[i] == '\t')
            tabs++;
        if (str[i] == '\n')
            newLine++;
        i++;

    }

    printf("space:%d\ntabs:%d\nnew line:%d",space,tabs,newLine);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

程序中使用的scanf函数不安全,不允许计算空格。

<小时/> 注意。考虑到而不是

scanf("%s",&str);
          ^^^ 

是正确的
scanf("%s",str);
          ^^^

根据C标准函数main,不带参数应声明为

int main( void )

最好使用函数fgetc

例如

#include <stdio.h>

int main(void) 
{
    unsigned int space = 0;
    unsigned int tabs = 0;
    unsigned int newLine = 0;

    printf( "Enter the text: " );

    int c;

    while ( ( c = fgetc( stdin) )  != EOF )
    {
        switch ( c )
        {
        case ' ':
            ++space;
            break;

        case '\t':
            ++tabs;
            break;

        case '\n':
            ++newLine;
            break;
        }
    }

    printf( "\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine );

    return 0;
}

如果要输入这样的文字

Hi, Marco Roberts 
Welcome to SO

然后程序输出看起来像

space: 4
tabs: 0
new line: 2

使用Ctrl + z或Ctrl + d(取决于使用的系统)来中断输入。

另一种方法可以采用以下方式

#include <stdio.h>

#define N   100

int main(void) 
{
    unsigned int space = 0;
    unsigned int tabs = 0;
    unsigned int newLine = 0;

    printf( "Enter the text: " );

    char str[N];

    while ( fgets( str, sizeof( str ), stdin ) )
    {
        for ( const char *p = str; *p; ++p )
        {
            switch ( *p )
            {
            case ' ':
                ++space;
                break;

            case '\t':
                ++tabs;
                break;

            case '\n':
                ++newLine;
                break;
            }
        }           
    }

    printf( "\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine );

    return 0;
}

答案 1 :(得分:0)

更好的检查方法是比较ascii值。 C认为所有字符都在ascii中,而且就C而言。因此,不要将空间与空格进行比较,而是将其与0x20(ascii空格字符的十六进制代码)进行比较。同样适用于其他比较,它应该更好一点。

不要害怕向终端提供关于比较结果的印刷声明。例如,打印正在检查的字符与正在检查的字符以及结果。这将帮助您调试这里实际发生的事情。完成后不要忘记删除那些打印语句。

PS这里是ascii表的链接。 http://www.asciitable.com

答案 2 :(得分:0)

如果你想进行控制台输入(如评论中的@xing所述),你应该使用fgets而不是scanf。所以我们将:

#define SIZE_MAX 255

int main() {
    char str[SIZE_MAX];
    int i;
    int space;
    int tabs;

    printf("Enter the text : ");
    fgets(str, SIZE_MAX, stdin);    //stdin if it is a console input
    // Careful, if the input length is shorter than the SIZE_MAX (here 255),
    // Then a '\n' will be added at the end of your string. To counter it :
    if(strchr(str, '\n') != 0) {    //checks if there is a '\n'
        str[strlen(str)-1] = '\0';  //changes it to a '\0' (end of string)
    }

    //For the verifications, you can do that :
    for(i=0 ; i < strlen(str) ; i++) {
        if (str[i] == ' ') {
            space++;
        }
        if (str[i] == '\t') {
            tabs++;
        }
    }
    printf( "\nspace : %d\ntabs: %d\n", space, tabs);

    //NB : There will be no newLine because it is a console input.
    return 0;
}