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返回被忽略