LINUX.ORG.RU

sscanf сломался

 ,


0

1

Сейчас глупость спрошу, но почему

sscanf("{abc,45}", "{%256s,%d}", buf, &n)
возвращает 1, в buf какая-то херня, а n остаётся равным 0? ЧЯДНТ?

UPD: без указания размера, просто %s то-же самое.

★★

Последнее исправление: Dragon59 (всего исправлений: 1)

И да, при каждом новом вызове, херня в buf разная. 3 символа, но явно не abc.

Dragon59 ★★
() автор топика

sscanf () returns the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.

Т. о. образом в buf попадает вся строка {abc,45}, а n остаётся неизменным.
По поводу херни в buf, нужно смотреть - как и где объявлена buf, хз...

backbone ★★★★★
()
Ответ на: комментарий от backbone

Т. о. образом в buf попадает вся строка {abc,45}

Не должна же. Тем более, туда попадает только 3 символа, как и положено.

По поводу херни в buf, нужно смотреть - как и где объявлена buf, хз...

char buf[256] локально.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

%256s указывает длину, если указать %3s, то всё должно считаться нормально. Почему попадает 3 символа, честно говоря, не знаю...

backbone ★★★★★
()
Ответ на: комментарий от backbone

%256s указывает длину, если указать %3s, то всё должно считаться нормально.

Длину я потом добавил. Без длины или с 3, та же фигня.

Dragon59 ★★
() автор топика

УМВР, в str - abc,45}, в n - 0, по сути так и должно быть.

kostik1
()

Для теста сделал:

[penguin@arch ~]$ cat test.c 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    char a,c;
    int b=0;
    return printf("%d | %c | %d | %c",sscanf("a4c","%c%d%c",&a,&b,&c), a, b, c);
}
[penguin@arch ~]$ ./test 
3 |  | 0 | 
Тоже не работает, хотя возвращает 3, как и положено.

Dragon59 ★★
() автор топика
Ответ на: комментарий от backbone
int main(void) {
    char a,c;
    int b=0, result = 0;
    result = sscanf("a4c","%c%d%c",&a,&b,&c);
    return printf("%d | %c | %d | %c",result, a, b, c);
}
backbone ★★★★★
()
Ответ на: комментарий от backbone

Порядок вычисления sscanf, a, b, c не определён.

Точно, сглупил. А вот почему пример из первого поста без указания длины не работает, всё-ещё не ясно.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

Не должна же

Почему не должна? man scanf говорит нам

       s      Matches  a  sequence  of  non-white-space  characters;  the  next
              pointer  must be a pointer to character array that is long enough
              to hold the input sequence and the terminating null byte  ('\0'),
              which  is  added  automatically.  The input string stops at white
              space or at the maximum field width, whichever occurs first.

Таким образом «%256s» матчит строку до первого пробельного символа, но не больше 256 символов.

И действительно

$ cat >test.c <<END
> #include <stdio.h>
> int main()
> { char buf[256]; int n = 0, r = 0;
>   r = sscanf("{abc,45}", "{%s,%d}", buf, &n);
>   printf("result=%d\nstring=%s\nnumber=%d\n\n", r, buf, n);
> }
> END
$ gcc test.c ; ./a.out 
result=1
string=abc,45}
number=0
$

kim-roader ★★
()
Ответ на: комментарий от kim-roader

аким образом «%256s» матчит строку до первого пробельного символа, но не больше 256 символов.

Выше написал, что без указания размера то-же самое.

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

Выше написал, что без указания размера то-же самое.

Без указания размера результат должен быть как и с указанием 256, только контроля переполнения buf не будет.
Когда %3s указываете, результат корректный?

backbone ★★★★★
()
Ответ на: комментарий от backbone

Когда %3s указываете, результат корректный?

Ох, точно, работает. Сейчас только заметил, что у меня условие перед этим ложное было и, соответственно, sscanf вообще не выполнялся. С указанием размера 3 работает. И как мне быть? Считать символы, а потом формировать строку формата?

Dragon59 ★★
() автор топика
Ответ на: комментарий от backbone

И почему пример по ссылке выше говорит, что

/* целое, расположенное между двумя строками, пропускается */ scanf(«%s%*d%s», str, str2);

, хотя по вашей логике всё должно было считаться в str?

Dragon59 ★★
() автор топика
Ответ на: комментарий от Dragon59

Считать символы, а потом формировать строку формата?

Можно воспользоваться strchr (str, ','); По ссылке выше строка читается при помощи scanf, вероятно там предполагается, что между строкой и числом есть один из символов-разделителей (пробел, табуляция, '\n').

backbone ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.