1

您好,对于这个程序,我应该计算字符串中的单词数。到目前为止,我已经找到了如何查找字符串中的字符数,但无法弄清楚如何将组成单词的字母转换为 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 语句的中间部分是我感到困惑的地方。如何计算字符串中的单词数?测试这个测试字符串是否有多个空格,比如“你好,这是一个字符串”

4

4 回答 4

3

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

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

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

有了更多细节,初始化lastchar为空白,然后遍历输入中的每个字符。如果lastchar是空格而当前字符不是,则增加字数。

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

于 2012-11-25T22:28:40.917 回答
2

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

看看(它包括一些解释和示例):

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

和源链接

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

于 2012-11-25T22:34:19.273 回答
0

当你在 if 部分时,这意味着你在一个单词中。因此,您可以标记它inword并查看您是否从字外(这将是您的 else 部分)更改为inword和返回。

于 2012-11-25T22:31:00.217 回答
0

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

首先,一定要“知道”一个词是由什么组成的。让我们假设它仅由字母组成。所有其余的,标点符号或“空格”,都可以视为分隔符。

然后,您的“系统”有两种状态: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。

(如果我没有在疲劳的教唆上犯下一些严重的错误,它应该可以工作)

于 2012-11-25T23:00:03.580 回答