Для проекта я пытаюсь считать интервал и строку от строки. Единственной проблемой является 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 лет". Кто-либо знает, как зафиксировать это?
В следующей строке начнется чтение числа (% d
), за которым следует что-нибудь отличное от табуляции или новой строки (% [^ \ t \ n]
]).
sscanf("19 cool kid", "%d %[^\t\n]", &age, buffer);
Если вы хотите сканировать до конца строки (удаляя новую строку, если есть), просто используйте:
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 по определению).
Вам нужен спецификатор преобразования % c
, который просто считывает последовательность символов без специальной обработки пробелов.
Обратите внимание, что вам нужно сначала заполнить буфер нулями, потому что спецификатор % c
не записывает нулевой символ конца. Вам также необходимо указать количество символов для чтения (в противном случае по умолчанию используется только 1):
memset(buffer, 0, 200);
sscanf("19 cool kid", "%d %199c", &age, buffer);