使用fgets&& sscanf从数组中读取

时间:2016-04-21 08:16:32

标签: c arrays input scanf

我有一个文本文件,如下所示:

C M 2/1/2015 18280 "2107070770"
C U 2/1/2015 18300 "2107070770"

文本文件有多行。我想存储 每行进入一个字符串数组,然后存储每个值 进入变量,我想与之合作。 (我成功打开fopen文件)

我按以下方式存储每一行​​:

char line[50];
char *lines[40];
char *eof ; 
int i ; 
while( (eof = fgets(line, 50, in)) != NULL )
{
    lines[i] = strdup(eof);
    i++;
}

然后,我试图将每个值存储到变量中,方法如下:

for( j = 0; j <= 39 ; j++)
{
    sscanf( lines[j], "%c %c %d/%d/%d %d %s", &(operation), &(destination), &(day) , &(month) , &(year) , &(name)) ;    

    /*printf("%s\n", lines[j]);*/
}

所以,我可以单独处理每一行。 我的代码成功地将每一行存储到数组中,但之后 添加sscanf功能,它停止工作,没有任何输出。 我做错了什么?

2 个答案:

答案 0 :(得分:3)

对于

C U 2/1/2015 18300 "2107070770"

在2015年之后,您将丢失整数18300.格式字符串中有格式说明符,但没有相应的变量来存储它。

操作后,目的地,日,月,年, missing_variable ,名称

//so the right one will be
// assuming name is a char*

int my_int = 0;
for( j = 0; j <= 39 ; j++)
{
    sscanf( lines[j], "%c %c %d/%d/%d %d %s", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;    

    /*printf("%s\n", lines[j]);*/
}

答案 1 :(得分:0)

首先检查您的文件描述符是否成功指向您的文件

if(in==NULL)
  exit(-1); // Hope this is already in the code.

更改

int i ; 

int i=0; // automatic variables are not initialized by default

来自 ISO / IEC 9899:201x 6.7.9-&gt; 10

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。

当有人指出你在sscanf中有一个缺失的变量。如果您希望在age之后删除所有内容,请说18280 "2107070770"到字符串name,您可以这样做:

sscanf( lines[j], "%c %c %d/%d/%d %d %[^\t\n]", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;

同样有人指出name衰减指针,所以你不需要像&name

那样传递它