我必须了解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.我的问题是:
最后调用值a。因此,当使用sscanf或fscan时,我们只是输入任何类型输入的地址,或者我们是否使用& a因为它是一个输入fscan的整数?
为什么fgets被使用了两次?
pfin和LINEBUF做了什么?
稍后会出现在代码中:
fgets( line, LINEBUF, pfin);
fscanf(pfin," b: %d", &b );
我的问题是:
答案 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
期望%d
为int *
,则*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数组。
<小时/>
char line[100 + 1];
的类型为a
,因此表达式int
的类型为&a
。表达式int *
的类型为test_array
;在大多数情况下,数组表达式将被转换(“衰减”)到指针表达式,指针表达式的值将是数组的第一个元素的地址。此隐式转换仅适用于数组。