Разбиение строки sscanf не работает

Может кто-нибудь объяснить, почему строка не разбивается в следующем коде

#include <stdio.h>

int main(void)
{
    char name[] = "first:last";
    char first[20], last[20];

    sscanf(name, "%s:%s", first, last);

    printf("first: %s, last: %s", first, last);

    return 0;
}

Выход

первый: первый: последний, последний:

но это должно быть

первый: первый, последний: последний

Пожалуйста, проверьте код здесь http://ideone.com/JDSTt.


person MA1    schedule 27.12.2011    source источник
comment
Если бы вы проверили возвращаемое значение из sscanf(), оно бы сообщило вам, что было выполнено только одно преобразование, а не два, как вы ожидали, что дало бы вам убедительный намек на то, что в ваших ожиданиях что-то не так. Всегда проверяйте на наличие ошибок... особенно когда вас что-то сбивает с толку.   -  person Jonathan Leffler    schedule 27.12.2011


Ответы (2)


Вы можете использовать что-то вроде этого:

sscanf(name, "%[^:]:%s", first, last);

: не является пробелом, поэтому обычный %s не будет считаться разделителем. Дополнительные сведения см. на странице scanf.

(Отредактированная демонстрация: http://ideone.com/m4LVP)

person Mat    schedule 27.12.2011

См. документацию по сканированию о спецификаторе типа %s:

Строка символов. При этом будут считываться последующие символы до тех пор, пока не будет найден пробел (символы пробела считаются пробелами, символами новой строки и табуляции).

person codeling    schedule 27.12.2011