从输入文件中读取字符串并将其存储到动态数组中

时间:2018-12-20 21:53:54

标签: c arrays string file

我编写了一个代码,该代码从文件中读取字符串输入,然后将它们存储到动态分配的数组中。

我相信我已经正确存储了元素,但是当我尝试打印出那些元素时,会出现分割错误。

int main (int argc, char **argv) {

char reds [13];

int i;

    FILE *file = argc > 1 ? fopen (argv[1], "r") : stdin;
    if (file == NULL)
        return 1;
        if(argc!=2){
            printf("[ERR]");
            return 0;
        }

   for (i =0; i < 13; i++) {


      char *reds = malloc (sizeof(char)); 
    fscanf (file, "%s", &reds[i]);
  }


      for (i =0; i < 13; i++){
    printf (" %s\n", reds[i]);

  }
    return 0;   

   } 

输入文件:

RED A
RED 2
RED 3
RED 4
RED 5
RED 6
RED 7
RED 8
RED 9
RED 10
RED J
RED Q
RED K

有人可以告诉我我做错了什么吗? 预先谢谢你。

1 个答案:

答案 0 :(得分:2)

char reds [13];

这将分配一个包含13个元素的固定大小的字符数组;它可以容纳一个最长为12 char s的字符串(加上NULL终止符)。那不是你想要的。

char *reds = malloc (sizeof(char));

这将创建一个 new 变量reds,该变量隐藏您在上面声明的变量。这是一个指向只有单个char有足够空间的数组的指针;它只能容纳一个空字符串(NULL终止符)。那也不是你想要的。

fscanf (file, "%s", &reds[i]);

这会将fscanf()的指针传递到(原始)i数组的第reds个元素。由于reds具有13个元素,这意味着如果fscanf()存储的字符串在任何循环迭代中具有超过12 - i个字符,则该行为将是不确定的。同样,这不是您想要的。


您可能打算做的事情是这样的:

char *reds[13]; // an array of 13 POINTERS

// later, in your loop...
reds[i] = malloc(sizeof(char) * (max_string_length + 1));
fscanf(file, "%s", reds[i]); // see note below

1)不要忘记使用free()分配的指针malloc(),否则程序将发生内存泄漏。在您的示例中,这无关紧要,因为该程序会立即退出(释放内存),但是如果没有退出,内存将被泄漏,因此您应该养成良好的习惯。

2)如果fscanf()存储的字符串长于max_string_length,仍然可以调用未定义的行为;您可以通过passing a maximum width specified to fscanf()进一步改进。

3)sizeof(char)保证等于1,因此您可以根据需要将其忽略(尽管您愿意这样做,但为了清楚起见而保留它也没有什么害处)。

4)对malloc()fscanf()fopen()等的返回值进行错误检查。如果不这样,则会发生错误,程序可以轻松地继续执行以下操作:调用未定义的行为,这可能很难调试。减轻自己的痛苦,现在就养成这种习惯。