我编写了一个代码,该代码从文件中读取字符串输入,然后将它们存储到动态分配的数组中。
我相信我已经正确存储了元素,但是当我尝试打印出那些元素时,会出现分割错误。
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
有人可以告诉我我做错了什么吗? 预先谢谢你。
答案 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()
等的返回值进行错误检查。如果不这样,则会发生错误,程序可以轻松地继续执行以下操作:调用未定义的行为,这可能很难调试。减轻自己的痛苦,现在就养成这种习惯。