gpt4 book ai didi

c - 使用 C 从文本文件中打印出数组

转载 作者:行者123 更新时间:2023-11-30 17:17:47 25 4
gpt4 key购买 nike

我正在尝试创建一个代码,它从纺织品中读取数据,然后将数据存储到内存中,打印到屏幕上以便用户可以读取它,但它仍然保存到内存中以便您可以使用它对于程序的其余部分..

这是纺织品的 sample

            75
nevermind
nvm
not much
nm
no problem
np
people
ppl
talk to you later
ttyl
because
cuz
i don't know
idk
as soon as possible
asap
yeah
ya
how are you
hru
you

这样的例子不胜枚举,如果算上第一个数字的话,总共有150个单词,151行。 75 用于告诉您有多少对。

无论如何,这是我到目前为止编写的代码,它使用这个结构

            typedef struct
{
char *English;
char *TextSpeak;
}Pair;

到目前为止我编写的代码是:

                FILE *infile =fopen("dictionary.txt","r");

int phraseCounter;
fscanf(infile, "%i", &phraseCounter); //Now you have the number of phrase pairs

//Allocate memory
Pair *phrases=malloc(sizeof(Pair) * phraseCounter);

//Run loop
for(int i=0; i < phraseCounter; i++){
//Get the english word
phrases[i].English = malloc(sizeof(char));
fscanf(infile,"%s",phrases[i].English);

//run loop to read next line
for(int a=0; a < phraseCounter; a++){
phrases[i].TextSpeak = malloc(sizeof(char));
fscanf(infile,"%s",phrases[i].TextSpeak);
}
printf("%s - %s\n", phrases[i].English, phrases[i].TextSpeak);

}

fclose(infile);

for(int i=0; i < phraseCounter; i++)
free(phrases[i].English);


free(phrases);

我不断得到的输出是:

            nevermind - atm
by - definitely
def -
-
-
-
-
-

并且一直持续到 75 行。

现在我不确定是否应该使用二维数组或者这是否可以接受。任何帮助将不胜感激!谢谢

最佳答案

phrases[i].English = malloc(sizeof(char));

这里的问题在于,您分配一个字节,然后尝试将一个字符串塞入其中,这会导致此处出现未定义的行为:

fscanf(infile,"%s", phrases[i].English);

通常,您应该假设一个合理的缓冲区长度并读取它,并检查是否包含新行。如果情况并非如此,请再次读入另一个缓冲区或放大旧缓冲区(使用 realloc )。要么使用非标准函数,如 getline这已经在幕后为您完成了此操作。

鉴于您的行是非常短的句子,恒定的缓冲区大小就足够了(我们称之为MAX_LINE),这为我们提供了一种更简单的方法来实现相同的目标:

fscanf(infile, "%*[^\n]s", MAX_LINE, buf);

这会将长度为 MAX_LINE 的字符串读取到缓冲区 buf 中,并在遇到 '\n' 之前终止。

读取字符串时,应避免使用 fscanf("%s", buf) 并使用 fgets()scanf("%*s", MAX_LINE, ...) 代替。这可确保不会尝试写入比您指定的数据更多的数据,从而避免缓冲区溢出。

编辑:嵌套循环不应该存在。您基本上覆盖了 phrases[i].TextSpeak 总共 phraseCounter 次,却没有任何好处。在此过程中,您会泄漏大量内存。

关于c - 使用 C 从文本文件中打印出数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com