只需从一组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/