我编写了以下程序,从文件中逐行读取并将其存储在单词数组中。输出应该是数组中的两个随机字。但令人惊讶的是,单词数组只包含重复读取的最后一个单词。对出了什么问题的任何帮助?
int main(){
int i = 0;
char line_buffer[BUFSIZ];
char* words[20];
FILE *fp = fopen("input.txt", "r");
while (fgets(line_buffer, sizeof(line_buffer), fp)) {
//printf("%s", line_buffer);
words[i] = line_buffer;
i = i + 1;
}
printf("%d", i);
int j = rand()%8;
int k = (j+1)%8;
printf("%s %s", words[j], words[k]);
fclose(fp);
return 0;
}
input.txt
nematode knowledge
empty bottle
nevertheless
claustrophobia
metamorphosis
acknowledgement
impossibility
never gave up
答案 0 :(得分:6)
您将每行数据读入同一缓冲区,因此最后一行会覆盖所有前一行。您将不得不通过某种方式或其他方式为每一行分配空间 - 使用malloc()
(或可能strdup()
)进行动态内存分配,或使用固定大小的数组(限制数量)程序可以安全处理的数据)。您还需要处理数据读取中的换行符。
使用fgets()
而不使用gets()
可以获得一些荣誉;这是一个100%正确的决定。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
enum { MAXLINES = 30 };
int main(void)
{
int i = 0;
char lines[MAXLINES][BUFSIZ];
FILE *fp = fopen("input.txt", "r");
if (fp == 0)
{
fprintf(stderr, "failed to open input.txt\n");
exit(1);
}
while (i < MAXLINES && fgets(lines[i], sizeof(lines[0]), fp))
{
lines[i][strlen(lines[i])-1] = '\0';
i = i + 1;
}
fclose(fp);
printf("%d\n", i);
srand(time(0));
int j = rand() % i;
int k = (j+1) % i;
printf("%s %s\n", lines[j], lines[k]);
return 0;
}
这将检查文件是否已成功打开,读取完成后立即关闭文件,并通过读取比数组可容纳的更多行来确保它不会触发堆栈溢出。它通过过度分配空间浪费了大量空间,因此每条线可能很长(尽管线条通常非常短)。如果一行比BUFSIZ长,它将被读入lines
中的几个相邻条目。它不假设数据文件中有8行。它会在每一行的末尾触发换行符(除非一行被分割,在这种情况下,它会在两行中的第一行之前分割最后一个字符)。它使用当前时间为随机数生成器播种。你只想要文件中的相邻行似乎很奇怪。
答案 1 :(得分:3)
int main(){
int i = 0;
int BUFSIZE = 1000;
char* words[20];
FILE *fp = fopen("input.txt", "r");
if (fp == 0){
fprintf(stderr, "Error while opening");
exit(1);
}
words[i] = malloc(BUFSIZE);
while (fgets(words[i], BUFSIZE, fp)) {
i++;
words[i] = malloc(BUFSIZE);
}
printf("Output: \n");
srand(time(NULL));
int j = rand()%i;
int k = (j+1)%i;
fflush(stdout);
printf("%d - %s %d -%s", j, words[j], k, words[k]);
int x;
for(x = 0; x<i; x++)
free(words[x]);
scanf("%d", x);
fclose(fp);
return 0;
}
PS。检查malloc结果
答案 2 :(得分:2)
您反复覆盖line_buffer中的内存。单词数组只包含指向此变量的指针。
您应该使用多维数组或在运行时分配内存。
顺便说一下:当你向你的代码传递超过20行时会发生不好的事情......
答案 3 :(得分:1)
您是否使用srand
初始化随机数生成器?一个解释,以及如何使用它的示例is available here。