在这段代码中,我想计算换行符和单词的字符数。 但是第二个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);
}
答案 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);
}