Ваша проблема связана с неправильным использованием или неправильным пониманием правильного использования спецификатора преобразования "%s"
. "%s"
будет считывать только до тех пор, пока не встретится первый пробел , а затем остановится. С "55 33 66"
, scanf
будет только читать "55"
, затем встретится с пробелом и прекратит чтение.
Чтобы прочитать всю строку, вы можете использовать класс символов "%[^\n]"' instructing
scanf to read all characters NOT a
'\ n'` (поэтому в основном читайте, пока не достигнете символа новой строки.
Но вы еще не закончили, у вас есть еще две задачи для правильного использования scanf
с вашим массивом. Поскольку ваш массив содержит только 100
символов, вы должны защитить свой массив, используя модификатор field-width , сообщающий scanf
, что нужно прочитать не более 99
символов, таким образом сохраняя место для нуль-заканчивающийся символ. Во-вторых, вы должны проверить return каждой функции пользовательского ввода, чтобы убедиться, что вы обрабатываете действительные данные. Поместив их в игру, вы можете сделать:
printf ("Num: ");
if (scanf ("%99[^\n]", numstr) != 1) {
fputs ("error: user canceled input.\n", stderr);
return 1;
}
Ваш токенизацию можно использовать без изменений, но type
, запрашиваемый разделителем, равен const char*
, поэтому вы должны обновить свою декларацию для dem
, e, g,
#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
const char *dem = " \t\n";
int main (void) {
printf ("Num: ");
if (scanf ("%99[^\n]", numstr) != 1) {
fputs ("error: user canceled input.\n", stderr);
return 1;
}
tok = strtok (numstr, dem);
while (tok != NULL) {
printf ("Token: %s\n", tok);
tok = strtok (NULL, dem);
}
}
( примечание: Я сделал dem
const char*
и добавил символы tab
'\t'
и newline
'\n'
в качестве разделителей)
Пример использования / Вывод
$ ./bin/strtok_numstr
Num: 55 33 66
Token: 55
Token: 33
Token: 66
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.