0

以下程序存储每个单词,然后将它们打印出来并多次出现。
全局typedef声明:

typedef struct {
    char * word;
    int occ;
}
words;
words *data=NULL;

我的搜索功能有问题。我创建了一个返回的函数int,如下所示:(max是结构数组的不断更新的大小,这就是为什么我在EOF达到之后调用搜索函数。)

int search(char *word,int max)
{
    int i;
    for(i=0; i<max; i++)
    {
        if(!strcmp(data[i].word,word)) return i;
    }
    return -1;
}

但我注意到我应该编写一个具有该原型的搜索函数:

struct abc *find(char *word)

所以我创建了以下代码:

struct words *findword(char *word)
{
    struct words *ptr;

    for (ptr = data; ptr != NULL; ptr++) {      /* IS THE STOP CONDITION OK? */
        if (strcmp(word, ptr->word) == 0)
            return ptr;
    }
    return NULL;          

}

我在编译过程中收到很多错误:

reverse.c:在函数'findword'中:

reverse.c:73:警告:来自不兼容指针类型的赋值

reverse.c:73:错误:指向未知结构的指针的增量

reverse.c:73:错误:指向不完整类型的指针的算术运算

reverse.c:74:错误:取消引用指向不完整类型的指针

reverse.c:在函数'main'中:

reverse.c:171: 错误: 'which' 未声明(在此函数中首次使用)

reverse.c:171:错误:(每个未声明的标识符只报告一次

reverse.c:171:错误:对于它出现的每个函数。)

制作:* [reverse.o] 错误 1


whichint分配给我第一次编写的搜索函数的返回的变量。错误which很容易修复,但我不知道如何替换它(使用我的基本搜索功能的解决方案):

data[which].occ++;

如何修复它以使其适用于我的新搜索方法?


编辑

main()添加:

int main(int argc, char **argv)
{
    char *word;
    words *temp;
    int c,i,num;
    /*int which;*/
    FILE *infile;

    if(argc!=2) {}      
    if((infile=fopen(argv[1],"r"))==NULL) {}
    num=0;
    while(1)
    {
        c=fgetc(infile);
        if(c==EOF) break;
        if(!isalpha(c)) continue;
        else ungetc(c,infile);
        word=getword(infile);
        word=convert(word);
        /*which=search(word,num);*/ 
        if(findword(word))
        {
            if(!(temp=realloc(data,sizeof(words)*(num+1))))
            {}
            else
                data=temp;
            data[num].word=strdup(word);
            data[num].occ=1;
            num++;
        }
        else
            data[which].occ++;

        free(word);
    }
    sort(num-1);
    for(i=0;i<num;i++)
    {}
    free(data);
    if(fclose(infile))
    {}  
    return 0;
}

我已经离开{}了不相关的代码片段,例如。错误处理。


EDIT2 我在上面要求的东西是固定的。但是,我现在遇到了段错误。我会给出整个代码的链接,我不想把它放在一个编辑过的帖子中,因为它会造成很大的混乱。Seg 错误是由第 73 行和第 152 行引起的(strcmp 无法正常工作)。希望完整的代码更容易理解。 完整代码

4

3 回答 3

2
for (ptr = data; ptr != NULL; ptr++) {    
/* IS THE STOP CONDITION OK? */

不,您的指针只会不断增加。在该代码中唯一会使其为 NULL 的是整数溢出。如果您将数据区域预设为 0,您可以查看它指向的内容,看看它是否为 NULL:

#define NUM_WORDS 100
data = calloc(NUM_WORDS,sizeof(words));

或者

#define NUM_WORDS 100
int bytes = NUM_WORDS * sizeof(words);
data = malloc(bytes);
memset(data,0,bytes);

……

for (ptr = data; ptr->word != NULL; ptr++) { 

如果您不想将数据区域预设为 0,那么您必须将当前保存在数据区域中的结构的当前数量传递给您的函数,以便知道要循环多少。

于 2012-09-18T13:00:20.467 回答
2

问题出在你的 findword 函数上,让我们遍历所有行

struct words *ptr; 

这不是你要做的。您在定义结构时使用的typedef允许您不再需要编写struct。这就是您收到错误消息的原因:reverse.c:73: error: increment of pointer to unknown structure. 你想要的只是:

words *ptr;    

接下来,循环:

for(ptr=data; //This is fine, you're assigning your local ptr to the global data. I assume that's something valid

ptr != NULL; //That could OK too... we can loop while ptr is not NULL
ptr++)       //This line makes no sense... 

您可能想查看 for 循环如何再次工作,关键是您正在递增某些内容,直到它达到一个条件。ptr++ 也会移动到您指向的位置,因此您将不再指向您的结构。

我需要查看您的main()功能以了解您要完成的工作,但根据您必须遵循的原型,我认为最简单的解决方案是:

void main()
{
    // init your vars
    bool more_words_to_add = true;
    words *ptr = NULL;
    int i;

    // populate your array of words
    while(more_words_to_add) {
        for(i = 0; i<max; i++) {
          if(ptr = findword("word"))  //if we find the word
            ptr->occ++;  //increment the number of times we found it
          else {
            //I don't know what you want to do here, it's not clear what your goal is.
            //Add the new word to your array of words and set occ to 1,
            //then increment max because there's one more word in your array?
          }
        }
        //get the next word to fine, or else set more_words_to_add = false to break
    }
}

如果这种类型的解决方案是您想要做的,那么您可以调整您的 findwords 功能非常简单:

struct words *findword(char *word)
{
    words *ptr = data;
    if (strcmp(word, ptr->word) == 0)
        return ptr;
    return NULL;
}  

编辑:对于您的新错误,我怀疑问题出在您的内存分配上,请参阅这个使用结构的简短示例:

words *findword(char *word)
{
    words *ptr = data;
    if(strcmp(word, ptr->word) == 0)
      return ptr;
    return NULL;
}

int main(){
    words *ptr;

    data = realloc(data, sizeof(words));
    data->word = "hello";                //DO NOT SKIP THESE LINES
    data->occ = 0;                       //DO NOT SKIP THESE LINES

    if(ptr = findword("hello")) {
      ptr->occ++;
      printf("I found %d %s's\n",ptr->occ, ptr->word);
    }
} 

mike@linux-4puc:~> ./a.out 
I found 1 hello's

您可以在这里看到您需要为全局结构分配一些内存,然后您可以在其中存储数据并将指针传递给它。

编辑2:

您的main()代码执行此操作:

if((ptr = findword(word)))
{
     //do stuff
}
else
  ptr->occ++;

那是行不通的,因为如果 findword() 失败它返回 NULL,所以在 if 检查 ptr 设置为 NULL,然后在 else 你试图尊重 NULL。如果(请记住,我并没有真正阅读您的逻辑,所以这取决于您)您真的想增加 ptr->occ 如果找不到单词,那么您需要这个:

if(findword(word))
{
     ptr = findword(word);
     //do stuff
}
else
  ptr->occ++; //increments the current ptr's occ, no new ptr was assigned.
于 2012-09-18T13:38:16.333 回答
1

您的程序中没有这样的东西struct words;有一个未命名的struct类型,以及该类型的 typedef words。要么使用struct words,要么words始终如一。

然后你需要更换

data[which].occ++;

result->occ++;

result新搜索功能的返回值在哪里。

于 2012-09-18T12:21:20.773 回答