2013-10-15 4 views
1

У меня вопрос о чтении ввода от scanf.Чтение различного ввода от scanf - языка C

Пользователь вводит одну из двух команд. Либо одна текстовая команда, либо две текстовые команды, разделенные одним пробелом.

Например:

начало

ИЛИ

начать программу

Я пытаюсь читать из зсапЕ. Но у меня проблема. Если я сделаю scanf("%s", input);, я предполагаю, что он войдет только в одну командную команду.

Если у меня scanf("%s %s", input1, input2);, я предполагаю, что он войдет в двухзвенную команду. Но если он введет одно слово, то сканер будет непрерывно потреблять пробел, пока не будет прочитан другой символ.

Для двухсловной команды я хочу сохранить каждое слово в отдельной строковой переменной.

Пожалуйста, помогите.

+1

Что именно Ваша цель/задача? Вы не знаете, что делает пользователь и хотите ли вы отреагировать на любой из них? – icbytes

+0

Обратите внимание, что вы можете использовать scanf ("% s", & input), то есть с помощью оператора-адресата. – PhillipD

+0

@PhillipD; Он не уверен, что 'input' является переменной указателя или просто переменной. – haccks

ответ

1

Удалить пространство в строке формата, изменение:

scanf("%s %s", input1, input2); 

в

scanf("%s%s", input1, input2); 

Чтобы понять это поведение прочитайте руководство: int scanf(const char *format, ...);:

Последовательность пробельных символов (пространство, вкладка, новая строка и т. д., см. isspace(3)). Эта директива соответствует любому количеству пробелов, в том числе нет, на входе.

Таким образом, из-за пробега после первого %s сканер непрерывно потребляет пробел, пока не будет прочитан другой символ.

Прочитано: "C Printf and Scanf Reference" good tutorial.

Вопрос: Если вы заинтересованы, прочитайте также "Store data in array from input" вопрос и ответ, это поможет вам в дальнейшем.

+0

Когда я прочитал вопрос, я подумал, что он говорит о том, как разобрать одну или две строки, не зная, что находится во входных данных. –

+0

@CharlieBurns Читайте связанный ответ и мою ссылку на scanf и printf .. Я уверен, что вам это нравится. –

+0

Это было не то, что я искал. Чарли ожоги прав, я не знаю, является ли вход двумя словами или одним. – user2817240

1

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

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    char cmd[100]; 
    char cmd1[100],cmd2[100]; 
    printf("enter command:"); fflush(stdout); 
    scanf("%s",cmd1); 
    printf("%s\n",cmd1); 
    if(strncmp(cmd1,"begin",strlen("begin"))==0) { 
     printf("read second word\n"); 
     scanf(" %s",cmd2); 
    } 
    else strcpy(cmd2,"none"); 
    printf("%s,%s\n",cmd1,cmd2); 
} 

результаты,

$ ./scanf2 
enter command:start 
start 
start,none 
$ ./scanf2 
enter command:begin command 
begin 
read second word 
begin,command 
+0

Спасибо, что это действительно сработало \ – user2817240

+0

Я предпочитаю fgets, а затем sscanf или strtok для синтаксического анализа. – ChuckCottrill

+0

@ user2817240 Хорошо, что вы нашли ответ, теперь вы можете [принять этот ответ, щелкнув по правой метке] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- работа? answertab = votes # tab-top) предпочтительный способ выразить благодарность, голосуя вверх :) –

Смежные вопросы