Считать числа из sscanf равны 0 - PullRequest
2 голосов
/ 10 января 2020

Добрый день сообществу. Код, который я пытаюсь написать, должен читать целые числа из файла, пропуская строки, начинающиеся с #. Моя проблема в том, что никакие числа не читаются и вместо этого он возвращает 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;
}

1 Ответ

2 голосов
/ 10 января 2020

Проблема в вашем коде в аргументах функции sscanf. Для этого требуется адреса всех переменных, которые являются «целями» для соответствующих полей формата (но чтение в char[] строках отличается, так как имя массива будет распадаться до указатель при использовании в качестве аргумента функции).

Итак, в вашем случае, чтобы прочитать два целочисленных элемента структуры, вы должны использовать это:

test = sscanf(buff, "%d%d", &array[counter].start, &array[counter].end);

Примечание 1 : Кроме того, вам не нужен оператор & для аргумента buff, так как он будет затухать, как упомянуто выше!

Примечание 2: Поскольку . (оператор доступа к элементу структуры) имеет более высокий приоритет , чем & (оператор адреса), выражение &array[counter].start совпадает с &(array[counter].start) - но вы можете предпочесть последнее, более явное код, так как этот может прояснить ситуацию для других, чтобы ее можно было прочитать и понять.

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...