Почему strtok () добавляет пробел к последнему токену - PullRequest
1 голос
/ 17 октября 2019

Я работаю над созданием простой версии Minix. Я использую fgets(), чтобы получить ввод пользователя. Затем я использую strtok(), чтобы разделить строку с разделителем " ". Проблема в том, что когда я вызываю strtok(NULL, " "), мой сохраненный токен добавляет пробел к последнему символу. Поэтому, если я передам "minimount imagefile.img", моя программа захватит minimount и сохранит ее в переменной cmd, затем она захватит "imagefile.img " и поместит ее в переменную flag. Обратите внимание, что пробел в конце переменной flag добавляется после метода токена.

Есть ли способ для меня получить только строку без пробела в конце после вызова токена. Или есть способ манипулировать строкой, чтобы удалить добавленное пространство?

printf("Minix: ");

fgets(cmd, BUFFLIM, stdin);

//parses string using delimiter " "

char *token = strtok(cmd, " ");

//assigns flag to what is after delimiter 

char *f = strtok(NULL, " ");

//printf("cmd:%s\nf:%s\n", cmd, f);

printf("cmd:%s\nf:%s", cmd, f);

Вывод:

cmd:"minimount"
f:"imagefile.img "

1 Ответ

4 голосов
/ 17 октября 2019

Стандартная функция fgets может добавить символ новой строки '\n' к введенной строке при условии, что в соответствующем массиве символов достаточно места.

Поэтому используйте

char *f = strtok(NULL, " \n");

вместо

char *f = strtok(NULL, " ");

Из стандарта C (7.21.7.2 Функция fgets)

2 Функция fgets считывает самое большее на один символ меньше, чем число символов, указанное в nиз потока, на который указывает поток, в массив, на который указывает s. Никакие дополнительные символы не читаются после символа новой строки (который сохраняется) или после конца файла. Нулевой символ записывается сразу после того, как последний символ прочитан в массив.

Другой метод заключается в первоначальном удалении символа из введенной строки, например,

#include <string.h>
#include <stdio.h>

//...

fgets(cmd, BUFFLIM, stdin);
cmd[ strcspn( cmd, "\n" ) ] = '\0';

Что касаетсяваш фрагмент кода, кажется, у вас есть следующий результат, как показано в демонстрационной программе.

#include <stdio.h>
#include <string.h>

int main(void) 
{
    char s[100];

    fgets( s, sizeof( s ), stdin );

    char *cmd = strtok( s, " " );

    char *f = strtok( NULL, " " );

    printf( "cmd:\"%s\"\nf:\"%s\"", cmd, f );

    return 0;
}

Вывод программы:

cmd:"minimount"
f:"imagefile.img
"
...