计算字符串中的单词

时间:2016-09-10 21:11:57

标签: c

我试图编写一个函数来计算字符串中特定单词的出现次数。例如:给定字符串 -

" S p,时间回家。 修复我。"

来信"至"出现三次(两次用不同的词);然而,"到"只出现一次。我该怎么办才能算出#34;到" (如果更多次出现在字符串中,则计算每一个字符串)。有什么建议? 这是我尝试和玩的代码。

int word(char inputLine[]) {
    int word = 0, i = 0, j = 0;

    for (i = 0; inputLine[i] != '\0'; i++) {
            if (inputLine[i] == 't' || inputLine[i] == 'o' || inputLine[i] != ' ') {
                word++;
            }
    }
    return word;
}

5 个答案:

答案 0 :(得分:1)

试试这个:

int word(char inputLine[]) {
    int word = 0, i = 0;

    // stop before the last char
    for (i = 0; inputLine[i] != '\0' && inputLine[i+1] != '\0'; i++) {

        // is (T or t) and (O or o)
        if ((inputLine[i] == 't' || inputLine[i] == 'T') && (inputLine[i+1] == 'o' || inputLine[i+1] == 'O')) {

            // after the 'to' is not a letter
            if ((inputLine[i+2] < 'a' || inputLine[i+2] > 'z') &&
                (inputLine[i+2] < 'A' || inputLine[i+2] > 'Z')) {

                // before is not a letter (or this is the start of the string)
                if (i == 0 ||
                    ((inputLine[i-1] < 'a' || inputLine[i-1] > 'z') &&
                     (inputLine[i-1] < 'A' || inputLine[i-1] > 'Z'))) {
                        word++;
                }
            }
        }
    }

    return word;
}

答案 1 :(得分:0)

让我们假设这些规则:

  

“to”只有在除了空格字符

之前和之后没有字符时才能成为单词

如果您接受这些规则有效且正确,则需要检查以下4个条件:

if (str[i]=='t'&& str[i+1]=='o'&& str[i-1]!='a-z'&& str[i+2]!='a-z'){
        word++;
    }

可以包含两个以上的条件来检查大写字母。

答案 2 :(得分:0)

最简单的方法是使用strtok。但是,如果您想手动完成所有操作,以下内容将起作用。虽然您只希望"to"这适用于任何搜索字符串:

#include <stdio.h>

// word -- get number of string matches
int
word(char *input,char *str)
// input -- input buffer
// str -- string to search for within input
{
    int chr;
    int prev;
    int off;
    int stopflg;
    int wordcnt;

    off = -1;
    stopflg = 0;
    wordcnt = 0;
    prev = 0;

    for (chr = *input++;  ! stopflg;  prev = chr, chr = *input++) {
        // we've hit the end of the buffer
        stopflg = (chr == 0);

        // convert whitespace characters to EOS [similar to what strtok might
        // do]
        switch (chr) {
        case ' ':
        case '\t':
        case '\n':
        case '\r':
            chr = 0;
            break;
        }

        ++off;

        // reset on mismatch
        // NOTE: we _do_ compare EOS chars here
        if (str[off] != chr) {
            off = -1;
            continue;
        }

        // we just matched
        // if we're starting the word we must ensure we're not in the middle
        // of one
        if ((off == 0) && (prev != 0)) {
            off = -1;
            continue;
        }

        // at the end of a word -- got a match
        if (chr == 0) {
            ++wordcnt;
            off = -1;
            continue;
        }
    }

    return wordcnt;
}

void
tryout(int expcnt,char *buf)
{
    int actcnt;

    actcnt = word(buf,"to");
    printf("%d/%d -- '%s'\n",expcnt,actcnt,buf);
}

// main -- main program
int
main(int argc,char **argv)
{
    char *cp;

    --argc;
    ++argv;

    for (;  argc > 0;  --argc, ++argv) {
        cp = *argv;
        if (*cp != '-')
            break;

        switch (cp[1]) {
        default:
            break;
        }
    }

    tryout(1,"to");
    tryout(2,"to to");
    tryout(1," to ");
    tryout(1,"todo to");
    tryout(2,"todo to to");
    tryout(2,"doto to to");
    tryout(1,"doto to doto");
    tryout(0,"doto");

    return 0;
}

答案 3 :(得分:0)

如果你必须只使用&#34;基本&#34; C函数上面的解决方案似乎没问题,但是如果你想构建一个更具伸缩性的应用程序(并且你想以更智能的方式解决问题),你可以使用一个操纵正则表达式的库。您可以查看以下答案:Regular expressions in C: examples?

正则表达式的优势在于您可以使正则表达式不可见(这是您的问题之一)。 我通常使用pcre因为它具有perl和java的正则表达式。 这是一个非常有用的例子,它使用pcre:http://www.mitchr.me/SS/exampleCode/AUPG/pcre_example.c.html

答案 4 :(得分:0)

type byNum []int

...

sort.Sort(byNum(a[:]))