Путаница по поводу Sscanf - PullRequest
       1

Путаница по поводу Sscanf

2 голосов
/ 11 марта 2011

Я хочу читать числа с плавающей точкой (и целые после) из строки, которую я получаю из файла.Когда я отлаживаю его, я вижу, что он без проблем извлекает строку из файла, но когда я пытаюсь его отсканировать, я получаю мусор.Вот мой код:

    while(fgets(line, 1000, file) != EOF)
    {
        //Get the first character of the line
        c = line[0];

        if(c == 'v')
        {
            sscanf(line, "%f", &v1);
            printf("%f", v1);
        }
    }

Значение, хранящееся в v1, является мусором.Почему это не работает, и как я могу получить плавающие и целые числа из этой линии?

Ответы [ 4 ]

5 голосов
/ 11 марта 2011

Вы включаете первый символ (который является 'v') в вызов sscanf, поэтому вызов не выполняется, а v1 остается нетронутым (с мусором в нем). Попробуйте вместо этого:

sscanf(line+1, "%f", &v1);
2 голосов
/ 11 марта 2011

Предположительно, v1 является поплавком?

В этом случае печать поплавка в памяти, как если бы это была строка 'c', будет плохой.
Вы можете попробовать printf("%f",v1);

    if(c == 'v')
    {
        sscanf(line, "%f", &v1);

Если строка начинается с 'v', то вы отправляете это в scanf и просите преобразовать его в число с плавающей точкой? Вы, вероятно, хотите перейти на символ (или больше, если у вас есть другие отступы), а затем начать читать с плавающей точкой в ​​строке [1]?

1 голос
/ 11 марта 2011

Поскольку при выполнении вызова sscanf() вы знаете, что первым символом в line является буква 'v', вы также можете сказать, что sscanf() не может преуспеть в преобразовании этого значения в double или float, потому что 'v' не является частью какого-либо действительного числа с плавающей точкой, представленного в виде строки.

Вы должны проверить возвращаемое значение из sscanf(); было бы сказано 0 (нет успешных конверсий), что говорит о том, что что-то пошло не так.

Вы можете преуспеть с:

if (sscanf(line+1, "%f", &v1) != 1)
    ...error...
1 голос
/ 11 марта 2011

Ваш оператор printf должен выглядеть следующим образом:

printf("%f\n", v1);

Кроме того, вы должны проверить возвращаемое значение sscanf, чтобы убедиться, что он даже находит и хранит число с плавающей запятой:

if(sscanf(line, "%f", &v1) < 1){
    /* didn't read float */
}else{
    printf("%f\n", v1);
}
...