计算C中的行,单词和字符

下面是我的计算行数,单词和字符的函数 –

void count(char* file) { int fd; long end=0; char c; long words=0; long lines=0; if((fd=open(file, O_RDONLY))>0){ end=lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); while(read(fd, &c, 1)==1){ if(c == ' ') words++; if(c == '\n') { lines++; words++; } } printf("The Number of characters in file is: %ld\n",end); printf("The Number of lines in file is: %ld\n",lines); printf("The Number of words in file is: %ld\n",words); close(fd); } else{ printf("Error: ",strerror(errno)); } } 

我对线条和字符的数量是正确的,但是在单词数量上是错误的。 如你所见,我正在计算空格数,如果有多个空格,如何计算单词(我不想使用f *函数,如fscanf与filepointer)? wc命令如何处理这个?

为什么你不使用strpbrk()标准的libc函数? 做一些事情:

  char keys[] = " \n"; ... while( expression ){ ret = read(fd, buf, BUF_LEN - 1); if (ret == -1) /*do errno*/ else if ( ret ) { char* p = buf; buf[ ret ] = '\0'; while( (p = strpbrk(p, keys)) ) { if (*p == key[1]) ++lines; ++words; ++p; } } else /* do close file */ } 

有很多方法可以解决这个问题。 一种可能是使用布尔标志来指示最后一个字符是否是空格字符。 然后,如果当前字符是空格最后一个字符不是空格,则只更新单词counter。

是的,这看起来不太对劲。 如果单词之间有多个空格会怎么样? 如果单词由制表符或换行符分隔,会发生什么?

相反,您应该跟踪状态。 你应该检查空格字符是否与isspace()一般。 当您点击不是空格的字符时,请设置IsInWord = true。 然后,当你点击空格字符集IsInWord = false时。 但是当你点击空格字符并且IsInWord为真时,首先计算单词。

你需要一个简单的状态机用于单词,一个用于行。 (你的行数也可能是错误的。例如,如果最后一行没有'\n'怎么办?)

你的单词状态机需要指出:(1)单词之间和(2)单词内部。 如果在状态1中获得非空格,则转换到状态2并递增计数器。 当您在状态2中获得空间时,转换回状态1。