2012-11-25 58 views
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; 
} 

我尝试了一些变化,但如果语句的中间部分是我很困惑。我如何计算字符串中的单词数量?测试这个测试,如果字符串有多个空格像“你好,这是一个字符串”

+0

你不能使用正则表达式吗? – danijar

+0

顺便说一句:代替'||',你可能需要使用'&&'。 (或者:将'!='改为'==',并交换if {}和其他{}体)。 – wildplasser

回答

3

只提示,因为这可能是作业。

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

如果一个是空白,另一个不是空白,那么就有一个转换。

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

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

+0

谢谢先生!对你没有给出答案,但让我知道了!虽然当你写下“如果lastchar是空格,当前字符不是,请增加字数”时,你确实给了我答案。 –

+0

我的父亲被称为先生,我的朋友(和网友)可以叫我pax :-)至于答案,你仍然需要编码。我只是不想让任何人回来抱怨说,数字是它的两倍。 – paxdiablo

0

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

0

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

首先,一定要“知道”一个词是由什么组成的。让我们假设它仅由字母组成。其余所有内容,即标点符号或“空格”,都可以视为分隔符。然后,你的“系统”有两个状态:1)完成一个单词,2)跳过分隔符。

您可以免费运行跳过分隔符代码来开始您的代码。然后你输入你将要保留的“完成一个单词”状态,直到下一个分隔符或整个字符串的结尾(在这种情况下,你退出)。当它发生时,你已经完成了一个单词,所以你将你的单词计数增加1,然后进入“跳过分隔符”状态。循环继续。

伪类似C的代码:如果所述读取的字符是在[A-ZA-Z_]例如,否则返回假

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 */ } 

函数can_be_part_of_a_word返回true。

(它应该工作如果我没有做过一些严重的错误与厌恶的教诲)