Почему ошибка? У меня проблема со strtok (); так долго - PullRequest
0 голосов
/ 25 мая 2019

Я хочу набрать число в одной строке. Это делает некоторые проблемы здесь

Я стараюсь следовать за другим. Я не знаю в чем тут проблема Меня заметили "[Предупреждение] не рекомендуется преобразовывать строковую константу в 'char *' [-Wwrite-strings]"

#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = " ";
main(){
    printf("Num:");
    scanf("%s",numstr);
    tok = strtok(numstr,dem);
    while(tok != NULL){
        printf("Token: %s\n",tok);
        tok = strtok(NULL,dem);
    }
}

показывало

ввод

Num: 55 33 66

выход

Token: 55

Я хотел

Token: 55
Token: 33
Token: 66

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Ваша проблема связана с неправильным использованием или неправильным пониманием правильного использования спецификатора преобразования "%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

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 25 мая 2019
#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = ' ';
int MAX_CHAR = 100; // Number character to read from the input buffer


int main(){
    printf("Num:"); 
    fgets(numstr, MAX_CHAR, stdin);
    tok = strtok(numstr, dem);
    while(tok != NULL){
        printf("Token: %s\n",tok);
        tok = strtok(NULL,dem);
    }
    return 0;
}
0 голосов
/ 25 мая 2019

Вам нужно сделать scanf("%[^\n]",&numstr), иначе он остановится перед пробелом или используйте вместо него fgets(numstr, 100, stdin).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...