下面是我计算行数,单词和字符数的函数 -
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命令如何处理这个?
答案 0 :(得分:1)
为什么不使用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 */
}
答案 1 :(得分:0)
有很多方法可以解决这个问题。一种可能是使用布尔标志来指示最后一个字符是否是空格字符。然后你只更新单词计数器,如果当前字符是空格并且最后一个字符不空格等等。
答案 2 :(得分:0)
是的,这看起来不太合适。如果单词之间有多个空格会怎么样?如果单词由制表符或换行符分隔,会发生什么?
相反,您应该跟踪状态。你应该检查isspace()
的空格字符是否正常。当您点击不是空格的字符时,请设置IsInWord = true。然后,当你点击空格字符集IsInWord = false时。但是当你点击空白字符并且IsInWord为真时,首先计算单词。
答案 3 :(得分:0)
你需要一个简单的状态机用于单词,一个用于行。 (你的行数也可能是错误的。例如,如果最后一行没有'\n'
怎么办?)
你的单词状态机需要指出:(1)单词之间和(2)单词内部。如果在状态1中获得非空格,则转换到状态2并递增计数器。当您在状态2中获得空间时,转换回状态1.