我试图编写一个函数来计算字符串中特定单词的出现次数。例如:给定字符串 -
" 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;
}
答案 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[:]))