从 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解释。