从 sscanf 读取的数字为 0
Read numbers from sscanf are 0
祝社区美好。我尝试编写的代码必须从文件中读取整数,同时跳过以 # 开头的行。我的问题是没有读取任何数字,而是 returns 0。
该文件如下所示:
#hello
#myname
#is
#file
122 4838
112 393949
1239 233
29393 44949
3 2
445 566
输出为:
0 0
Read 0 numbers
0 0
Read 0 numbers
0 0
Read 0 numbers
0 0
Read 0 numbers
密码是:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
int start;
int end;
} path;
int main()
{
int test;
path* array=malloc(sizeof(path));
if(array==NULL) {
printf("Error allocating memory\n");
abort();
}
FILE* fd=fopen("Test.txt","r");
if(fd==NULL) {
printf("Error opening file\n");
abort();
}
char buff[200];
int counter=0;
char c;
while(fgets(buff,200,fd)&&counter<6) {
c=buff[0];
if(c=="#") {
continue;
}
test=sscanf(&buff,"%d%d",array[counter].start,array[counter].end);
printf("%d\t%d\n",array[counter].start,array[counter].end);
printf("Read %d numbers\n", test);
counter++;
}
fclose(fd);
free(array);
return 0;
}
您的代码中的问题出在您对 sscanf
函数的参数中。这需要所有变量的 地址 是相应格式字段的 'targets' (但读取 char[]
字符串是不同的,因为数组名称将 decay to a pointer 用作函数参数时)。
因此,在您的情况下,要读入两个整数结构成员,您应该使用:
test = sscanf(buff, "%d%d", &array[counter].start, &array[counter].end);
注意 1:此外,您不需要 buff
参数上的 &
运算符,因为它会衰减,如上所述!
注2:因为.
(结构成员访问运算符)比&
(地址运算符)有一个higher precedence,表达式&array[counter].start
与 &(array[counter].start)
相同 - 但您 可能 更喜欢后者,更明确的代码,因为此 可以 让其他人更清楚阅读并理解。
随时要求进一步澄清and/or解释。
祝社区美好。我尝试编写的代码必须从文件中读取整数,同时跳过以 # 开头的行。我的问题是没有读取任何数字,而是 returns 0。 该文件如下所示:
#hello
#myname
#is
#file
122 4838
112 393949
1239 233
29393 44949
3 2
445 566
输出为:
0 0
Read 0 numbers
0 0
Read 0 numbers
0 0
Read 0 numbers
0 0
Read 0 numbers
密码是:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
int start;
int end;
} path;
int main()
{
int test;
path* array=malloc(sizeof(path));
if(array==NULL) {
printf("Error allocating memory\n");
abort();
}
FILE* fd=fopen("Test.txt","r");
if(fd==NULL) {
printf("Error opening file\n");
abort();
}
char buff[200];
int counter=0;
char c;
while(fgets(buff,200,fd)&&counter<6) {
c=buff[0];
if(c=="#") {
continue;
}
test=sscanf(&buff,"%d%d",array[counter].start,array[counter].end);
printf("%d\t%d\n",array[counter].start,array[counter].end);
printf("Read %d numbers\n", test);
counter++;
}
fclose(fd);
free(array);
return 0;
}
您的代码中的问题出在您对 sscanf
函数的参数中。这需要所有变量的 地址 是相应格式字段的 'targets' (但读取 char[]
字符串是不同的,因为数组名称将 decay to a pointer 用作函数参数时)。
因此,在您的情况下,要读入两个整数结构成员,您应该使用:
test = sscanf(buff, "%d%d", &array[counter].start, &array[counter].end);
注意 1:此外,您不需要 buff
参数上的 &
运算符,因为它会衰减,如上所述!
注2:因为.
(结构成员访问运算符)比&
(地址运算符)有一个higher precedence,表达式&array[counter].start
与 &(array[counter].start)
相同 - 但您 可能 更喜欢后者,更明确的代码,因为此 可以 让其他人更清楚阅读并理解。
随时要求进一步澄清and/or解释。