刚刚开始使用C语言,试图了解使用fgets,sscanf和fscanf获取值

时间:2016-07-04 17:50:59

标签: c fgets scanf

我必须了解C中的其他人的代码,我试图了解如何使用fgets,sscanf和fscanf定义变量。

输入:./ test 0 testfile.txt

代码:

int main(argc,argv)
    int argc;
char *argv[];
{
char line[LINEBUF+1] //I assume this is where line type is 'defined'?
FILE *fopen(), *pfin ;
int   a, b;
char test_array[5]

...

pfin = stdin ;
fgets( line, LINEBUF, pfin);
sscanf(line," %s  %d", test_array,  &a)
fgets( line, LINEBUF, pfin);
fprintf(stderr,"%d\n",a);

这似乎读入了输入./test 0 testfile.txt,所以a引用0.我的问题是:

  1. 最后调用值a。因此,当使用sscanf或fscan时,我们只是输入任何类型输入的地址,或者我们是否使用& a因为它是一个输入fscan的整数?

  2. 为什么fgets被使用了两次?

  3. pfin和LINEBUF做了什么?

  4. 稍后会出现在代码中:

    fgets( line, LINEBUF, pfin);
    fscanf(pfin,"  b: %d", &b );
    

    我的问题是:

    1. 在此部分之前,我从未在代码中的任何位置看到过b值。此代码是从文件testfile.txt中获取内容并为变量b赋值吗?

1 个答案:

答案 0 :(得分:0)

int main(argc,argv)
    int argc;
    char *argv[];
{
   ...

这是一种非常古老的定义函数参数的方式,不应再用于新代码中(自20世纪80年代后期以来已经过时);相反,它应该写成

int main( int argc, char *argv[] ) 
{
   ...
  

最后调用值a。所以当使用sscanf或fscan时,我们只是输入任何类型输入的地址,或者我们使用& a因为它是一个输入fscan的整数?

每个转化说明符(%s%d%f等)都希望相应的参数具有正确的类型。在行

sscanf(line," %s  %d", test_array,  &a)

%s期望其对应的参数test_array具有类型char *,而%d期望其对应的参数&a具有类型{{ 1}}。幸运的是,参数是正确的类型 1 ,所以一切都应该有效。请注意,转化说明符对int **scanf有不同的含义。如果*printf期望%dint *,则*scanf需要int

  

为什么fgets被使用了两次?

您没有提供足够的代码来回答这个问题。看起来代码正在将每个输入行作为文本(使用*printf)读取,然后从该行解析数据(使用fgets)。基于您发布的有限片段,它期望至少输入的第一部分被构造为使得一行具有短字符串(最多4个字符长),然后是整数,类似于

sscanf

由于你没有说明在此之后如何处理AAAA 10 ,所以任何人都猜测它应该包含什么。

  

pfin和LINEBUF做了什么?

line被设置为指向标准输入流;老实说,它是多余的,你可以在其位置使用内置变量pfin

stdin是一个扩展为整数文字或整数表达式的宏,它用于指定LINEBUF数组的大小。一个例子是

line

预处理后,上面的代码变为

#define LINEBUF 100
...
char line[LINEBUF + 1];

请记住,在C中,字符串是一系列字符值,后跟一个0值终结符值。因此,要存储 n - 字符串,您需要预留一个 n + 1元素的char数组。

<小时/>

  1. 表达式char line[100 + 1]; 的类型为a,因此表达式int的类型为&a。表达式int *的类型为test_array;在大多数情况下,数组表达式将被转换(“衰减”)到指针表达式,指针表达式的值将是数组的第一个元素的地址。此隐式转换适用于数组。