将数据导入到不规则的数组

时间:2017-12-07 17:08:53

标签: c arrays

作为练习,我构建了一个简单的程序,给定一个N小写单词和空格的文本文件,填充一个参差不齐的数组char *en[N]

它的工作没有太大的问题,除了一个:它只用输入的最后一个字填充参差不齐的数组。

#include<stdio.h>
#include<ctype.h>

int main(int argc, char *argv[]){
    int i = 0, j = 0;
    char *en[100];
    char temp[20];

    FILE *p = fopen(argv[1], "r");
    char single;

    while((single = fgetc(p)) != EOF){
        if(!isspace(single))          /* Temporary store a single word */
            temp[i++] = single;
        else{
            temp[i] = '\0';
            en[j++] = temp;           /* Save stored word in ragged array */
            i = 0;
        }
    }

    printf("%s\n", en[0]);    /* Return the same than en[1] and en[99] */
    printf("%s\n", en[1]);
    printf("%s\n", en[99]);

    return 0;
}

我无法理解为什么它会一直到输入文件的末尾。我无法发现可能暗示错误做法的重大问题。

修改

我的方法背后的原因是可以用这种形式初始化*char数组:

p[0] = "abc";

推测我错误地试图在上面的错误中翻译,@coderredoc出色地抓住了。就单个词和输入的维度而言,我承认我没有多少关注它们。练习以不同的主题为中心。无论如何,非常感谢您宝贵的建议!

2 个答案:

答案 0 :(得分:4)

您的charcaters数组都指向同一个char数组,然后数组的内容最后更改为最后一个单词。你得到最后一个字。

可能的解决方案

en[j++] = temp;

en[j++] = strdup(temp);

然后,您将实现您希望程序拥有的行为。

答案 1 :(得分:2)

你刚刚发现了指针的精彩,恭喜!

说真的,char *en[100]是一个指针数组。 en[j++] = temp;将指向temp的第一个值的指针指定给en[j++]处的指针。你一遍又一遍地这样做。毫不奇怪,你最终得到一个指针数组,所有指向同一个数组temp,它保存最后一个单词的内容。

从中学到什么:指针只指向某个内存,并且在执行en[j++] = temp;时不会发生内存复制。您必须自己将复制temp的内存分配给新内存。