【问题标题】:Trying to find the index of a word within a line (measured as number of words)试图在一行中找到一个单词的索引(以单词数衡量)
【发布时间】:2014-09-25 06:04:04
【问题描述】:

我有以下代码,它检查一行。计算一些单词并计算每个单词出现的频率。基本上,我想添加一个计数器,以便对于每个单词(由 getNextWord 获取),它将该单词的数量记录为 struct word_t 中的 wordCount (例如,如果该行是“所有,猫!游泳非常far”,我需要它为所有人记录 0,为猫记录 1,为游泳记录 2,等等)这是我正在处理的功能:

void
func4(line_t * linePtr, int argnum, char * argval[]) {

    int getfrequency(line_t* linePtr, char* checkword);
    word_t word;
    int Size;
    int i;
    int k=0;
    int wordfound[MAX_QUERYLENGTH]; /* 1 if query term matches word in line */
    for(i = 1; i < argnum; i++,k++) {
        int freq = 0;
        int offsetval = 0;
        int* offset = &offsetval;
        wordfound[i] = 0; 


        if (wordfound[i] == 1) {
            freq = getfrequency(linePtr, argval[i]);            
            /* this is where I require access to the index */
        }
    }                   
}

我的结构在这里定义。请注意,stopIndex 和 startIndex 以字符为单位。我要查找的索引(以单词为单位)将称为 wordCount(如下所列)。

typedef struct word_t {
  int startIndex;
  int stopIndex;
  int wordCount;
  int frequency;
  char buf[MAX_LINELEN];
  int wordSz; /* szie of word*/
} word_t;

仅供参考,我也将函数调用放在这里: 而 (-1 != (line.lineLength = getline((char**) &line.buf, &maxSz, stdin))) { /* 更多代码在这里! */ stage4(&line,argc,argv,&word); }

我曾尝试在调用 getNextWord 之后添加 word.wordCount++,但这不起作用(即使在函数调用所在的 while 循环中初始化为 0 之后)。我也一直在尝试使用 wordPtr->wordCount,但没有得到我想要的。

谢谢。

进一步说明: 我正在使用 argv 为 argval 的命令行参数。这些构成查询词。然后我逐行搜索查询词的文本(stdin)。频率是与查询词匹配的单词在文本的 1 行中出现的频率(例如,如果查询词是“cat hat mat”并且标准输入的第一行是“cat cat cat sat that”,那么cat 的频率为 3)。

我需要的是获取标准输入的每一行并记录与查询词匹配的每个单词的单词编号(wordCount)(匹配是使用 strncasecmp 确定的)。也就是说,如果query是“cat hat mat”,stdin的第一行是“cat cat cat sat mat”,我需要记录第一只猫在wordCount = 0,第二只猫在wordCount = 1,第三只猫在 wordCount = 2 处,而 mat 在 wordCount = 4 处。我只需要一种将这些 wordCounts 中的每一个存储在我的结构中的方法,以供以后访问。

【问题讨论】:

  • 您的程序和问题描述有些混乱。您阅读了stdin 中的行,但也查看了论点。您是否只需要作为参数传递的单词的单词频率?您可能想阐明您的程序如何与示例调用、行输入和预期输出一起工作。它还有助于获取您已定义的各种类型的定义。
  • 您好,感谢您的反馈!我将编辑帖子并评论正在发生的事情。
  • 至于索引:我认为您可以在调用getNextWord 的循环中保留一个位置计数并重新定义wordfound 的含义:如果单词是,则将其设为-1 '未找到,如果找到则为索引。
  • 文体旁注:请不要在使用它们的函数内部声明外部函数。它在 C 中是允许的,但它使代码难以阅读。将它们放在源代码的顶部(或者更好的是,放在标头中)以清晰地分离实现和接口。
  • @MOehm 感谢您对风格的帮助。我一定会在完成后清理它(只是为了避免现在让自己感到困惑),并且下次会记住这一点。我还进行了编辑以澄清我的问题。更改 wordfound(如果未找到单词,则为 -1)会如何影响这一点,抱歉?我在调用 getNextWord 时确实有 word.wordCount++,但它不起作用(它返回的是地址而不是计数)

标签: c function pointers struct


【解决方案1】:

我会以不同的方式解决这个问题。您可以在单个循环中获取单词的频率和第一次出现。我还会交换内部和外部循环,因此您不必重新标记循环。

使用每个单词的计数器来跟踪单词索引。同样保留一个频率数组。

void stage4(line_t * linePtr, int argnum, char * argval[])
{
    word_t word;
    int wordindex[MAX_QUERYLENGTH];    /* First index in this line or -1 if none */
    int freq[MAX_QUERYLENGTH];         /* Frequency in this line */
    int count = 0;                     /* Word counter */

    int offsetval = 0;
    int* offset = &offsetval;
    int i;    

    /* Initialise */
    for(i = 1; i < argnum; i++) {
        wordindex[i] = -1;
        freq[i] = 0;
    }

    word = getNextWord(linePtr->buf, linePtr->lineLength, offset, &word);

    while (0 != word.stopIndex) {           
        for(i = 1; i < argnum; i++,k++) {
            if (0 == strcasecmp(argval[i], word.buf)) {
                /* Found a word, update frequency and pos */
                if (freq[i] == 0) wordindex[i] = count;
                freq[i]++;

                /* Assuming argval is unique, there are no further hits */
                break;
            }
        }                   

        /* Update word count and read next word */
        count++;
        word = getNextWord(linePtr->buf, linePtr->lineLength, offset, &word);
    }    

    /* Print frequencies */    
    for(i = 1; i < argnum; i++) {
        if (wordindex[i] >= 0) printf("%s: %d\n", argval[i], freq[i]);
    }   
}

此代码未经测试,因为我无法访问您的(相当复杂的)阅读功能。它也没有解决如何存储本地频率和位置以供进一步使用。但它应该让您大致了解如何解决这个问题。

(单词索引的-1在这里是多余的,因为没有单词已经用零频率表示,但如果频率是所有行的累加值,它可以使用。)

【讨论】:

  • 我很抱歉。目前整个事情非常复杂。我真的很感谢你的帮助,谢谢。整个事情都有效,除了索引始终为 0(我承认,这几乎可以肯定是由于我的复杂功能以及您无法访问它的事实)。我仍然不是 100% 了解如何自己计算索引,或者对不起
  • 好的,我忘记更新count,抱歉。我会编辑帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多