чтение строки с пробелами с sscanf

Для проекта я пытаюсь считать интервал и строку от строки. Единственной проблемой является sscanf, кажется, повреждает чтение %s, когда это видит пространство. Там должен так или иначе обойти это ограничение? Вот пример того, что я пытаюсь сделать:

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char** argv) {
    int age;
    char* buffer;
    buffer = malloc(200 * sizeof(char));
    sscanf("19 cool kid", "%d %s", &age, buffer);

    printf("%s is %d years old\n", buffer, age);
    return 0;
}

То, что это печатает: "прохладный 19 лет", где я должен "охладиться, ребенку 19 лет". Кто-либо знает, как зафиксировать это?

37
задан SDLFunTimes 18 May 2010 в 04:03
поделиться

3 ответа

В следующей строке начнется чтение числа (% d ), за которым следует что-нибудь отличное от табуляции или новой строки (% [^ \ t \ n] ]).

sscanf("19 cool kid", "%d %[^\t\n]", &age, buffer);
42
ответ дан 27 November 2019 в 04:43
поделиться

Если вы хотите сканировать до конца строки (удаляя новую строку, если есть), просто используйте:

char *x = "19 cool kid";
sscanf (x, "%d %[^\n]", &age, buffer);

Это потому, что % s соответствует только не- пробельные символы и остановятся на первом найденном пробеле. Спецификатор формата % [^ \ n] будет соответствовать каждому символу, который не соответствует (из-за ^ ) в данном выделенном фрагменте (который является новой строкой). Другими словами, он будет соответствовать любому другому персонажу.


Имейте в виду, что вы должны выделить достаточно места в вашем буфере, чтобы принять строку, поскольку вы не можете быть уверены, сколько будет прочитано (хорошая причина держаться подальше от scanf / fscanf , если вы не используете определенная ширина поля).

Вы можете сделать это с помощью:

char *x = "19 cool kid";
char *buffer = malloc (strlen (x) + 1);
sscanf (x, "%d %[^\n]", &age, buffer);

(вам не нужен * sizeof (char) , поскольку это всегда 1 по определению).

8
ответ дан 27 November 2019 в 04:43
поделиться

Вам нужен спецификатор преобразования % c , который просто считывает последовательность символов без специальной обработки пробелов.

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

memset(buffer, 0, 200);
sscanf("19 cool kid", "%d %199c", &age, buffer);
12
ответ дан 27 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: