使用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) ;