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

标签 c arrays memory file-io struct

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

这是纺织品的 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/29361903/

相关文章:

javascript - 计算一个元素在多个其他数组中出现的次数 JavaScript

python - 在 Python 中合并 2 个排序列表的有效解决方案

php - 递归删除数组键前缀

c++ - 内存错误c++ private int

c++ - 标准算法库中的哪些算法进行分配,有没有办法指定这种分配是如何发生的?

memory - Domino 8.5.3 64 位中 HTTPJVMMaxHeapSize 的最佳设置

c - 在循环中使用 If 语句时出现段错误

c++ - cgroup C/C++ 库是否存在?

c - fwrite() 不向文件写入任何内容 - C

C 递归 Collat​​z 猜想,直到值小于原始整数