Почему strtok так взаимодействует с scanf? - PullRequest
1 голос
/ 27 февраля 2012

Так что мой проект оболочки шел впереди, но мой последний спидбамп вводит пользовательский ввод.Я пытаюсь токенизировать входную строку, но после первого токена strtok возвращает только NULL.Но если я напишу строку в программе, все будет работать безупречно.Как мне обработать пользовательский ввод, чтобы strtok токенизировал всю строку (вместо первой)?

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

int main ()
{
  char input[100];
  scanf("%s", input); //input entered is "echo 1 2 3 4"
  char *temp=strtok(input, " "); //this is "echo"
  printf("temp1: %s\n", temp);
  temp=strtok(NULL, " "); //this is (null)
  printf("temp2: %s\n", temp); 

}

Ответы [ 2 ]

3 голосов
/ 27 февраля 2012

Проблема с scanf("%s"...), который прекращает чтение с первого символа пробела и возвращает строку.Другими словами, scanf("%s"...) не будет читать более одного слова.

См. Здесь в разделе '% s': http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

scanf("%[^\n\r]", string_variable) может быть лучшей идеей.

Обновление: Как упомянул Сет в комментариях, "%[^\n\r]" означает чтение всех символов до тех пор, пока не встретится какой-либо из символов после ^.

2 голосов
/ 27 февраля 2012

Обязательно прочитайте документацию по функциям, которые вы используете. Спецификатор формата %s «будет читать последующие символы до тех пор, пока не будут найдены пробелы (пробелы считаются пустыми, перевод строки и табуляция)». Это означает, что input будет содержать только строку echo.

См. этот ответ о том, как правильно прочитать строку из файла.

...