只需从一组puding文件中读取一些puding字符串,然后将它们放入puding数组中,以便稍后由puding qsort_r进行排序。它能有多难?

printf("%d -- %s\n", arr_i, words[arr_i]);


因此可以准确打印。

但是这个

        printf("%d : %s\n", i, words[i]);


只重复显示单词[0]。

在我将新笔记本电脑从愤怒和沮丧中解脱出来之前,有人可以帮我发现问题吗?

任何帮助表示赞赏!

谢谢。

static void *reducer(void *arg){
    int index=*((int*)arg);
    printf("reducer %d here! %d\n", index, max_words_per_input_file[index]);

    // we will put words of N files here.
    char* words[max_words_per_input_file[index]];

    int j;
    int i;
    int arr_i=0;
    char file_name[FILE_NAME_SIZE];

    // read file
    char * temp;
    FILE *file;
    for(j=0; j<R; j++){
        // create file name
        // tempj-i 0<=j<=N-1 0<=i<=R-1
        char file_name[FILE_NAME_SIZE];
        sprintf(file_name, "temp%d-%d", j, index);

        file = fopen(file_name, "r");
        if (file == NULL) {
            printf("Error opening file\n");
            return NULL;
        }

        // scan the next %s from stream and put it to temp
        while(fscanf(file, "%s", &(*temp)) > 0){
            printf("reducer reads: %s\n", temp);

            words[arr_i] = temp;
            printf("%d -- %s\n", arr_i, words[arr_i]);

            arr_i++;

        }
        fclose(file);
    }


    // open a temp file to write
    FILE *temp_output_file;
    sprintf(file_name, "temp%d", index);
    temp_output_file = fopen(file_name, "w");
    if (temp_output_file == NULL) {
        printf("Error opening file\n");
        return NULL;
    }
    // fprintf(temp_output_file, "%s\n", temp);

    fclose(temp_output_file);

    for(i=0; i<arr_i; i++){
        printf("%d : %s\n", i, words[i]);
    }

    int thunk = WORD_LENGTH;
    qsort_r(words, sizeof(words)/sizeof(words[0]), sizeof(words[0]), cmpstringp, &thunk);

    //hash


    pthread_exit(NULL);
}

最佳答案

您实际上有两个问题。

首先是words是一个指针数组,并且使所有指针相同,它们都指向相同的位置。

第二个问题要严重得多,因为您没有初始化temp,这意味着它的值将是不确定的,并指向您随后写入的看似随机的位置。这导致undefined behavior

您应该做的是为temp分配内存,为您读取的每个字符串分配一个新的内存。并且,一旦完成,别忘了释放内存。

关于c - 我在这里做错了什么?数组决定不保留其值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28880176/

10-08 23:03