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

使用fgets&&;从数组中读取的sscanf,c,arrays,input,scanf,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)) !=

我有一个文本文件,看起来像:

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]);*/
}
用于(j=0;j用于线路

C U 2/1/2015 18300 "2107070770"
2015年之后,您缺少整数18300。您在格式字符串中有一个格式说明符,但没有相应的变量来存储它

操作后,目的地、日期、月份、年份,缺少\u变量,名称

//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]);*/
}
//所以正确的答案是
//假设名称是字符*
int my_int=0;

对于(j=0;j来说,首先检查文件描述符是否成功指向文件

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

int i ; 

来自ISO/IEC 9899:201x 6.7.9->10

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

有人指出,sscanf中缺少一个变量。如果您希望在
年龄
后撕掉所有内容,请对字符串
名称
18280“2107070770”
,您可以这样做:

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

另外,正如有人指出的那样,
name
衰减为指针,因此您不需要像
&name
while((eof=fgets(line,50,in))!=NULL)
-->
while(fgets(line,50,in))那样传递它
,最后一个参数是
scanf
,您不需要传递地址,因为
name
已经(或衰减为)指针。
i
在这里没有初始化。。自动变量默认情况下没有初始化。七个转换说明符。六个变量。未定义的行为。您死了。-)我死了!x)谢谢!!非常感谢!!是否有任何方法可以忽略引号\“?您可能需要使用自定义函数将其去掉。非常感谢mate!!是否有任何方法可以忽略引号\“?将
%[^\t\n]
更改为
%[^\t\n]
。您可以看到我添加了一个引号。这称为扫描集,使用
^
开始时,我们告诉scanf拒绝使用它后面的字符。如果您不使用
^
则表示仅从包含的字符集读取,例如
[a-zA-Z]
仅读取范围内的字符
sscanf( lines[j], "%c %c %d/%d/%d %d %[^\t\n]", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;