计算字符串中的单词

时间:2014-12-15 17:35:56

标签: c string

while( (ch = fgetc( infile )) != EOF )
    if(ch ==' ') words++;

它很好用,但是如果我们在字符串中有空行,我们应该如何检测这些行并将这些行计算正确?

3 个答案:

答案 0 :(得分:6)

您的代码不计算单词,它会计算空格。在许多情况下,两个计数会有所不同 - 例如,当单词被多个空格分隔时。

你需要改变逻辑,使你设置一个布尔标志"我在一个单词内#34;当您看到属于某个单词的字符时,当它看到空白字符(空格,制表符或换行符)时具有以下逻辑:

if (isspace(ch)) {
    if (sawWordFlag) {
        words++;
        sawWordFlag = false;
    }
}

检测角色是否属于某个单词的一种方法是在其上调用isalnumisalnumisspace函数都要求您包含<ctype.h>标题。

答案 1 :(得分:2)

所以sscanf已经做了你需要的东西,它会在包含制表符和换行符的字符串之前占用任意数量的空格。此算法也适用于前导或尾随空格。

int words = 0;
int i = 0;

while(sscanf(inFile, "%*s%n", &i) != EOF){
    inFile += i;
    words++;
}

sscanf非常多才多艺,你可以轻松地读出每个单词如下:

int words = 0;
int size = strlen(inFile);

if(size > 0){
    char* word = (char*)malloc((size + 1) * sizeof(char));

    for(int i = 0; sscanf(sentence, "%s%n", word, &i) > 0; sentence += i){
        // Do what you want with word here
        words++;
    }
    free(word);
}

答案 2 :(得分:0)

char prev = 'x'; // anything but space
while((ch == fgetc(infile)) != EOF)
{
    if(ch == ' ' && ch == prev)
        continue;
    else if(ch == ' ' && ch != prev)
        words++;
    prev = ch;
}