繁体   English   中英

计数字符串中的单词?

[英]Counting words in a string?

您好,对于该程序,我应该计算字符串中的单词数。 到目前为止,我已经找到了如何查找字符串中的字符数,但是无法弄清楚如何将构成单词的字母转换为1个单词。

我的职能是:

int wordcount( char word[MAX] ){

    int i, num, counter, j;

    num = strlen( word );
    counter = 0;

    for (i = 0; i < num; i++)
    {
        if (word[i] != ' ' || word[i] != '\t' || word[i] != '\v' || word[i] != '\f')
        {

        }

    }

    return counter;
}

我尝试了一些变体,但是if语句的中间部分让我感到困惑。 如何计算字符串中的单词数? 测试此字符串是否有多个空格,例如“ Hello this is a string”

仅因为这可能是家庭作业而提示。

您要计算的是“单词”字符和空白之间的过渡数量。 这将需要记住最后一个字符并将其与当前字符进行比较。

如果一个是空格,而另一个不是,则有一个过渡。

更详细地讲,将lastchar初始化为空格,然后循环输入中的每个字符。 如果lastchar是空格,而当前字符不是空格,请增加字数。

不要忘记在每次循环迭代结束时将当前字符复制到lastchar 希望不用说,字数应该初始化为0。

有一个linux util'wc'可以计数单词。

看一看(包括一些说明和示例):

http://en.literateprograms.org/Word_count_(C)

以及到源的链接

http://en.literateprograms.org/index.php?title=特殊:DownloadCode / Word_count_(C)&oldid = 15634

当您处于if部分时,表示您在一个字里面。 因此,您可以标记该inword并查看您是否从单词外(这是您的其他部分)更改为inword并返回。

这是一个快速的建议-可能有更好的方法,但是我喜欢这种方法。

首先,请务必“知道”一个单词的成分。 让我们假设它仅由字母组成。 所有其余的标点符号或“空白”都可以视为分隔符。

然后,您的“系统”具有两种状态:1)完成一个单词,2)跳过分隔符。

您可以自由运行跳过分隔符代码来开始编写代码。 然后,进入“正在完成单词”状态,直到下一个分隔符或整个字符串的末尾(在这种情况下,您将退出)。 发生这种情况时,您已经完成了一个单词,因此将单词计数器加1,然后进入“跳过分隔符”状态。 并且循环继续。

类似伪C的代码:

char *str;

/* someone will assign str correctly */

word_count = 0;
state = SKIPPING;

for(c = *str; *str != '\0'; str++)
{
    if (state == SKIPPING && can_be_part_of_a_word(c)) {
        state = CONSUMING;
        /* if you need to accumulate the letters, 
           here you have to push c somewhere */
    }
    else if (state == SKIPPING) continue; // unneeded - just to show the logic
    else if (state == CONSUMING && can_be_part_of_a_word(c)) {
        /* continue accumulating pushing c somewhere 
           or, if you don't need, ... else if kept as placeholder */
    }
    else if (state == CONSUMING) {
        /* separator found while consuming a word: 
           the word ended. If you accumulated chars, you can ship
           them out as "the word" */
        word_count++;
        state = SKIPPING;
    }
}
// if the state on exit is CONSUMING you need to increment word_count:
// you can rearrange things to avoid this when the loop ends, 
// if you don't like it
if (state == CONSUMING) { word_count++; /* plus ship out last word */ }

例如,如果读取的字符位于[A-Za-z_]中,则函数can_be_part_of_a_word返回true,否则返回false。

(如果我没有因疲倦而做一些严重的错误,那应该起作用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM