fscanf-in-C分割错误
我试图从文件中读入值并将其存储在结构中 结构包含fscanf-in-C分割错误,c,segmentation-fault,scanf,C,Segmentation Fault,Scanf,我试图从文件中读入值并将其存储在结构中 结构包含 char region char country[100] int country_code 这种结构的实例称为c[100] 我试图读入的文件如下所示 Europe 0 France 1 England 2 Germany 有一个未知的国家数量,所以它一直保持阅读,直到EOF 我已经创建了一个结构数组 到目前为止,我的代码如下所示: fp= fopen(countries,"r"); while (!feof(fp)) {
char region
char country[100]
int country_code
这种结构的实例称为c[100]
我试图读入的文件如下所示
Europe
0 France
1 England
2 Germany
有一个未知的国家数量,所以它一直保持阅读,直到EOF
我已经创建了一个结构数组
到目前为止,我的代码如下所示:
fp= fopen(countries,"r");
while (!feof(fp))
{
fscanf(fp, "%[^\n]", c.region);
while (!feof(fp))
{
fscanf(fp, "%d, %[^\n]", c[i].country_code, c[i].country);
i++;
}
}
我有一个分割错误。我确信这是我明显遗漏或做错的事情,但我不确定是什么,如果有人能帮助我,我将不胜感激。您需要记录国家/地区代码和国家/地区字段的地址:
fscanf(myfile, "%d, %[^\n]", &c[i].country_code, &c[i].country);
Otherwize fscanf将这两个整数值作为指针进行解释,并尝试将数据存储到其中=>segmentation fault
fscanf(myfile, "%d, %[^\n]", c[i].country_code, c[i].country);
应该固定到
fscanf(myfile, "%d, %[^\n]", &(c[i].country_code), c[i].country);
因为fscanf需要一个地址来写入数据。您不需要对char数组使用&
,因为它已经是一个指针了
另外,在您的结构char区域中
应改为字符区域[100]代码>由于您没有区域的一个字符,而是多个字符,请使用字符串
myfile = fopen(countries,"r");
检查返回值是否有错误
while (!feof(myfile))
{
fscanf(myfile, "%[^\n]", c.region);
您需要传递c.region的地址:&c.region
。但是,这仍然是错误的,因为您只分配了一个字符,fscanf将读取字符,直到不匹配为止。您应该将c.region的声明更改为字符数组c.region[[00]
或其他内容
另外,c是一个数组,而不是一个结构,所以我认为这不是您实际使用的代码。您是指c[0].region吗
你也应该担心读的东西比你分配的要多。仔细阅读fscanf限制它在地址中存储的东西的方法
你在哪里把i设为零
while (!feof(myfile))
{
fscanf(myfile, "%d, %[^\n]", c[i].country_code, c[i].country);
同样,您需要传递country\u code字段&c[i]的地址。country\u code“
。请注意,您不需要在country字段上使用&运算符,尽管目前的其他答案说您可以这样做,因为country是字符数组,所以c[i]。country与&c[i]相同。country
i++;
如果文件中的行数多于c[i]数组中分配的条目,会发生什么情况?使用类似struct的
char region[100]
char country[100]
int country_code
它应该有用
char aregion[100]="", line[100];
...
while( fgets(line,100,myfile) )
{
if( *aregion && 2==sscanf(line,"%d%99[^\n]",&c[i].country_code,c[i].country) )
strcpy(c[i++].region,aregion);
else
if( !strchr(line,' ') )
sscanf(line,"%99[^\n]",aregion);
}
c[i].country已经是一个字符数组了,不&这里是必需的。您是对的,没有必要&for country。但是它不是char
,它是一个char数组(char[100]
)。当将char数组作为参数传递给函数时,编译器会将其转换为char指针(char*)
。不要使用feof()控制循环。此处formatspec中的-1逗号错误,fscanf返回被忽略