程序计算c中的行字和字符

时间:2019-02-14 16:11:37

标签: c

在这段代码中,我想计算换行符和单词的字符数。 但是第二个while循环中有一些我听不懂的问题;代码也没有输出。

//program to count newlines new words and characters

#include<stdio.h>
int main()
{
    int c;
    int nl,nw,nc;//nl=newline,nw=new word,nc=new charcacter
    nl=nw=nc=0;
    while((c=getchar())!=EOF)
    {
        nc++;
        if(c=='\n')
        nl++;
        else if(c!=(' ')||c!=('\n'))
        {
            nw++;
            while(c!=' '||c!='\n')
            { 
                c=getchar();
                nc++;
            }
            nc++;
        }
    }
    printf("%d %d %d",nl,nc,nw);
}

3 个答案:

答案 0 :(得分:4)

此条件将始终为真:

(c!=(' ')||c!=('\n'))

如果任意一方的评估结果为true,则逻辑OR运算符||的评估结果为true。如果c是空格,则第一部分为false,而第二部分为true,从而使结果为true。如果c是换行符,则第一部分为true,第二部分甚至不进行评估,从而使结果为true。如果c是任何其他值,则两个部分都为true。

您想在此处使用逻辑AND,仅在两个部分为true时才为true。如果c不是空格并且c不是换行符,则您希望条件为真:

((c!=' ') && (c!='\n'))

答案 1 :(得分:0)

这是解决类似问题的尝试。


代码

#include <stdio.h>

///check is given character is a valid space (' ','\n', '\t' ) or not
int checkSpace(char c){
    if(c=='\n'||c==' '||c=='\t'){
        return 1;
    }else{
        return 0;   
    }
}

///if given character is in ascii valid return true
int checkASCII(char c){
    if(c>32&&c<127){
        return 1;
    }else{
        return 0;   
    }
}

///a function that prints all contents of ascii file
void printFile(FILE *fp){
    char c;
    while((c=fgetc(fp))!=EOF){
        printf("%c", c);
    }
}

////main function 
int main(int argc, char **argv){

    FILE *fp=fopen(argv[1],"r");
    if(!fp){
        printf("error when opening file\n");    
    }

    char c=0;
    int numWord=0;
    int numChar=0;
    int flag=0;
    int visiblenumChar=0;
    int newLine=0;

    while((c=fgetc(fp))!=EOF){
        numChar++;
        if(c=='\n'){
            newLine++;
        }
        if(flag && checkSpace(c)){
            numWord++;
            flag=0;     
        }       
        if(checkASCII(c)){
            flag=1;//first ascii read   
            visiblenumChar++;   
        }   
    }

    //program output
    printf("file name: %s\n", argv[1]);
    printf("#All characters: %d\n", numChar);
    printf("#Visible characters: %d\n", visiblenumChar);
    printf("#Words: %d\n", numWord);
    printf("#New lines: %d\n", newLine);

    return 0;   
}

编译

  

gcc计数器。c-o计数器

运行

  

./计数器yourtextfile.txt

答案 2 :(得分:0)

实际上,内部循环是不必要的。您可以使用外循环读取所有字符。然后检查字符是'\ n'还是'',并相应地增加计数器。

//program to count newlines new words and characters
#include<stdio.h>
int main()
{
    int c;
    int nl,nw,nc;//nl=newline,nw=new word,nc=new charcacter
    nl=nw=nc=0;
    while((c=getchar())!=EOF)
    {
        nc++;
        if(c==' ')
        nw++;
        else if(c=='\n')
        {
            nw++;
            nl++;

    }
    printf("%d %d %d",nl,nc,nw);
}