我的文本文件格式如下:
my.txt
Red
Green
Blue
Yellow
我特灵着用这样的词:
typedef char * string;
main(){
int i;
string array[4];
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++)
fscanf(data, "%s", &array[i]);
fclose(my);
}
当我尝试打印数组时,出现错误。我的代码出了什么问题,如何修复?
4条答案
按热度按时间ie3xauqp1#
您需要为以null结尾的字符串分配内存。
目前,你只为4个
char *
分配内存,但是这些指针没有初始化,因此当你试图向它们指向的内存写入数据时,会导致 UB(未定义行为)。工作示例片段
在下面的代码片段中使用“%127s”是为了防止我们在分配的内存范围之外写入。对于我们正在讨论的 format-string,我们将最多读取/写入127字节+空终止符。
请记住,如果要在“真实的生活”中使用,则应实施进一步的错误检查。
file_handle
是否确实有效malloc
是否确实分配了请求的内存fscanf
是否读取了所需的输入输出
uz75evzq2#
你试图读取一些数据,但你没有地方可以放它。你所拥有的只是4个指针,指着天知道在哪里,而你正试图写进去!
有很多方法可以做到这一点:
1.你知道数据大小的界限:
1.假设数据的大小有一个绑定,并忽略其余的字符串(如果它太大):
1.读取文件两次,第一次找出每个字符串的大小(或最大大小,为简单起见),然后为字符串分配内存(使用
malloc
)。然后再次读取文件,这次实际存储字符串:1.从输入中逐块读取。对于每个字符串,如果输入字符串尚未完成,则调整为字符串分配的内存大小(增加其大小),读取另一个块并再次检查。方法3更快,我推荐它,但你要知道,这基本上是C++的
string
中发生的事情。osh3o9ms3#
因为所有其他的答案都告诉你你做错了什么,而不是如何修复它。这里
就像他们说的,你为指针腾出了空间,但没有为指针指向的东西腾出空间。
nwsw7zdq4#
第一步是获取文本文件中的行数,然后初始化一个字符串数组,其大小与文本文件中的行数相同,然后以编程方式循环所有行,同时将每行上的单词分配给数组中相应的索引,如下面的代码所示。