Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从输入文件中读取字符串并将其存储到动态数组中_C_Arrays_String_File - Fatal编程技术网

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

C 从输入文件中读取字符串并将其存储到动态数组中,c,arrays,string,file,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; i

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

我相信我已经正确地存储了元素,但是当我试图打印出这些元素时,我得到了一个分割错误

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;   

   } 
有人能告诉我我做错了什么吗? 先谢谢你

这将分配一个具有13个元素的固定大小字符数组;它可以保存一个长度不超过12
char
s的字符串(加上空终止符)。那不是你想要的

这将创建一个新变量
reds
,该变量隐藏了上面声明的变量。这是一个指向一个数组的指针,该数组只有一个
字符
;它只能保存一个空字符串(空终止符)。那也不是你想要的

这将传递一个指向(原始)
reds
数组的第i个元素的指针。由于
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();您可以通过以下方式进一步改进此功能

3)
sizeof(char)
保证等于1,因此如果您愿意,可以省略它(尽管为了清晰起见,如果您喜欢这样做,将其保留在其中没有坏处)

4) 对
malloc()
fscanf()
fopen()
等的返回值进行错误检查。如果不进行错误检查,并且出现错误,则程序很容易继续调用未定义的行为,这可能很难调试。省去你自己的很多痛苦,现在就养成这个习惯

这将分配一个具有13个元素的固定大小字符数组;它可以保存一个长度不超过12
char
s的字符串(加上空终止符)。那不是你想要的

这将创建一个新变量
reds
,该变量隐藏了上面声明的变量。这是一个指向一个数组的指针,该数组只有一个
字符
;它只能保存一个空字符串(空终止符)。那也不是你想要的

这将传递一个指向(原始)
reds
数组的第i个元素的指针。由于
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();您可以通过以下方式进一步改进此功能

3)
sizeof(char)
保证等于1,因此如果您愿意,可以省略它(尽管为了清晰起见,如果您喜欢这样做,将其保留在其中没有坏处)


4) 对
malloc()
fscanf()
fopen()
等的返回值进行错误检查。如果不进行错误检查,并且出现错误,则程序很容易继续调用未定义的行为,这可能很难调试。省去很多痛苦,现在就养成这个习惯。

非常感谢,我还有一个问题。当我打印出数组元素时,输出如下所示
red\nk
如何更改?我希望它像这样打印出来,当我想打印这些元素时,我必须将数组大小增加到26,我想我知道为什么它也会将值(例如A)存储到数组中。谢谢,我还有一个问题。当我打印出数组元素时,输出如下所示
red\nk
如何更改?我希望它像这样打印出来,当我想打印这些元素时,我必须将数组大小增加到26,我想我知道为什么它也会将值(例如A)存储到数组中
char *reds = malloc (sizeof(char));
fscanf (file, "%s", &reds[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