2016-05-03 3 views
1

Я создал автоматический вводный бот, который имитирует символы строки, заданные пользователем.Как ввести строку, содержащую ' n' в ней

Мой код заключается в следующем:

printf("Enter speed (wpm) (1 to 11750):"); 
    scanf("%d", &speed); 
    if(speed < 1 || speed > 11750) 
    { 
     printf("\nPlease provide CORRECT DATA\n"); 
     return -1; 
    } 

    printf("Paste the String : \n"); 
    gets(exaArray); 
    exaArrayLength = strlen(exaArray); 
    relation = (int)11750/speed; 
    printf("typing will start in 2 sec-\n"); 
    Sleep(2000); 
    i=pos=0; 

    while(i<=exaArrayLength) 
    { 
     Sleep(relation); 
     if((exaArray[pos]>96) && (exaArray[pos]<123)) //small letters 
     { 
      keycode=0x41 + (exaArray[pos]%97); 
      smallLetter(keycode); //function for key simulation 
     }  
     ..... 

Я принимаю вход с использованием получает функцию. Эта программа отлично работает, когда я вставляю текст, который не содержит Enter. Таким образом, эта программа отлично работает с одним абзацем. Но если пользователь предоставляет более одного абзаца, он имитирует только первый абзац.

Потому что gets заканчивается на '\ n'. Какая функция может принимать несколько абзацев и назначать их строке.

+1

Петля вокруг функции чтения, объединяя то, что было прочитано до сих пор. – alk

+3

OT: Aaand do *** нет *** используйте 'gets()', но вместо этого используйте 'fgets()'. – alk

+0

@alk sir, если я использую input как это - fgets (s, 20000, stdin); не будет ли этот оператор завершаться, если есть ввод или \ n в пользовательском вводе? –

ответ

2

Ну, нет никакого способа, чтобы компьютер мог сделать разницу между нажатием кнопки пользователя и «вставленной» строкой, содержащей символы новой строки. (Технически, вставлять что-то в консоль, как впечатывать его.)

Если вы просто не хотите, чтобы проблема выходила после одного абзаца, но продолжайте, вы можете сделать это, как предложил комментатор alk (цикл вокруг функции чтения) - тогда вам понадобится Ctrl + C для выхода из программы, и тогда будет технически все еще один абзац за раз. В зависимости от того, что вы хотите делать с программой.

С другой стороны, если вы хотите, чтобы пользователь сразу вводил весь текст и только затем обрабатывал его, вам нужно было бы определить что-то другое, кроме «новой строки» как маркер «конец ввода», например что-то вроде ESC.

Вы бы сделать это с помощью getchar вместо gets и вручную конкатенации каждый символ, который вводится таким образом в буфер строк, и если символ имеет значение 27 (побег ключ), например, вы бы закончить цикл ввода и начать вывод.

3

Это на самом деле очень сложная и сложная проблема, и ее легко решить автоматическим способом.

Казалось бы, чтение в цикле было бы хорошим решением, но тогда вы дойдете до точки, когда больше нет ввода, а функция чтения просто блокирует ожидание большего ввода. Самый простой выход из этого состоит в том, чтобы пользователь вводил комбинацию клавиш «конец файла» (CTRL-D на системах POSIX, таких как Linux или OSX, CTRL-Z на Windows), но затем пользователю следует сообщить для этого.

Проблема связана с тем, что ваша программа просто не знает, сколько данных она должна читать, и нет функции, которая в принципе может читать мнение пользователей, когда пользователь думает «вот и все, не более данные".

Помимо вышеупомянутого решения, которое дает пользователю «конец файла», вы можете использовать другие последовательности или специальные клавиши или даже фразы ввода для обозначения конца, но все сводится к следующему: чтение ввода в пока пользователи не скажут «больше нет ввода».