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个元素的固定大小字符数组;它可以保存一个长度不超过12char
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个元素的固定大小字符数组;它可以保存一个长度不超过12char
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