2010-03-18 7 views
2

Мне нужно выполнить то же поведение, что и .NET Console.ReadLine. Выполнение программы должно продолжаться, когда пользователь нажимает клавишу ввода.C - эквивалент .NET Console.ReadLine

Следующий код не является достаточным, так как она требует дополнительного ввода:

printf ("Press Enter to continue"); 
scanf ("%s",str); 

Любые предложения?

+0

Я думаю, что вы путаете проблему, прося функциональность ReadLine, но только для того, чтобы действительно прочитать один символ; следовательно, разнообразие ответов. Я использовал Console.ReadKey() – Clifford

ответ

5

Вы можете использовать fgets(), например так:

#include <stdio.h> 

fgets(buf, sizeof(buf), stdin); 
2

Используйте функцию GetChar()

+0

получил единственный символ, а не строку. Perrhaos вы имели в виду gets(), но это опасная функция, и вместо этого следует использовать fgets(). – Clifford

+0

@Clifford, OP действительно продемонстрировал пример нажатия пользователем одной клавиши (например, [enter]) ... –

+0

Ah! Я обратился к требованию о реализации функции Console.ReadLine(). Теперь я вижу ваш момент. – Clifford

2

попробовать это:

printf ("Press Enter to continue"); 
scanf(“%[^\n]“,str); 
0

getline, вероятно, лучше, чем getchar в большинстве случаев , Он позволяет захватывать все входные данные пользователя перед «enter» и не подвержен переполнениям буфера.

char *buf=NULL; 
printf("Press enter to continue: "); 
getline(&buf,0,stdin); 
// Use the input if you want to 
free(buf); // Throw away the input 
+0

То, что вы сказали, верно для gets(), а не getchar(), которое получает только один символ из stdin. Обратите внимание: getline() является расширением GNU для стандартной библиотеки. C++ имеет аналогичные функции istream :: getline() и :: getline(), которые нельзя путать. В ISO C используйте fgets(). – Clifford

+0

@Clifford: 'getchar' ответит на * любой * символ, а не просто введите. Теперь это может быть намерение OP, и оно * будет * работать, но это не то, что он просил. Но моя проблема заключается в том, что он немного хрупкий, если пользователь не обращает внимания (то есть они забывают, что приглашение подходит и начинают вводить следующую команду, 'getchar' ест этот первый символ сразу, чтобы терминал не останавливался, и их следующий ввод короток - главный символ). И да, 'fgets' является стандартным, но в наши дни' getline' является частью POSIX, а не только GNU. – dmckee

+0

Ах! Я обратился к требованию о реализации функции Console.ReadLine(). Теперь я вижу ваш момент. Хотя getchar() не подвержен переполнениям буфера и где stdin является строковым буфером, не будет возвращаться до нажатия ENTER. – Clifford

0

Вы можете использовать do while с функцией scanf.

do{ 
    scanf("%s",str1); 
}while(str1[0] == '\0' || str1[0] == '\r' || str1[0] == '\n'); 
+1

Пожалуйста, не включайте подпись с сообщениями. Особенно не тот, который содержит ссылку. Вы можете сделать это в своем профиле. – Glorfindel

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