C - Чтение со стандартного ввода при наборе символов

Как заполнить 80-символьный буфер символами, когда они вводятся, или пока не будет нажата клавиша возврата каретки, или буфер заполнен, в зависимости от того, что произойдет раньше.

Я рассмотрел много разных способов, но нужно нажать Enter, тогда значение input * обрезается на 80 ...

Благодарю.

 Dave04 апр. 2012 г., 06:24
смотреть в проклятия, или ioctl
 user88468504 апр. 2012 г., 06:46
Как я могу найти заголовочные файлы для ioctl
 paxdiablo04 апр. 2012 г., 06:48
Видетьstackoverflow.com/questions/4023895/... для надежного решения для пользовательского ввода.
 user88468504 апр. 2012 г., 06:26
сделаю спасибо.
 Sean04 апр. 2012 г., 06:59
Паксдиабло имеет правильную идею. Решение, на которое он ссылается, использует fgets (), который, кажется, делает то, что вы хотите.

Ответы на вопрос(3)

#include<stdio.h>
...
int count=0;
char buffer[81];
int ch=getchar();
while(count<80&&ch!='\n'&&ch!='\r'&&ch!=EOF){
    buffer[count]=ch;
    count=count+1;
    ch=getchar();
}
buffer[count]='\0';

buffer как строка, убедитесь, что вы переварили оставшуюся часть строки ввода, чтобы подготовить поток ввода для его следующего использования.

Это можно сделать с помощью следующего кода (взятого изscanf разделэтот документ):

scanf("%*[^\n]");   /* Skip to the End of the Line */
scanf("%*1[\n]");   /* Skip One Newline */
 Sean04 апр. 2012 г., 06:48
Я не думаю, что вам нужны функции scanf (). Если вы читали до конца строки или до EOF, у вас больше нет символов во входном потоке, не так ли?
 Ariel04 апр. 2012 г., 06:48
Код исправлен. Неплохо для того, чтобы быть первым C-кодом, который я написал примерно за полтора года.
 paxdiablo04 апр. 2012 г., 06:39
getchar() возвращаетИНТГусь. В противном случае EOF не будет работать :-)
 paxdiablo04 апр. 2012 г., 06:43
символыне целые, они могут быть целочисленными, но это не имеет значения. Причина, по которой getchar возвращает int, заключается в том, что вы должны иметь возможность возвращать каждый символплюс индикатор eof.
 Ariel04 апр. 2012 г., 06:41
голецпеременные в CИНТ-s, но я мог бы также сделать код правильным :)

вы не можете использовать C io. Вы должны сделать это Unix способом. (или способ Windows)

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main() {
  char r[81];
  int i;
  struct termios old,new;
  char c;
  tcgetattr(0,&old);
  new = old;
  new.c_lflag&=~ICANON;
  tcsetattr(0,TCSANOW,&new);
  i = 0;
  while (read(0,&c,1) && c!='\n' && i < 80) r[i++] = c;
  r[i] = 0;
  tcsetattr(0,TCSANOW,&old);
  printf("Entered <%s>\n",r);
  return 0;
}
 user88468509 апр. 2012 г., 01:57
Спасибо, посмотрю как это работает ..
#include <stdio>
...
char buf[80];
int i;
for (i = 0; i < sizeof(buf) - 1; i++)
{
    int c = getchar();
    if ( (c == '\n') || (c == EOF) )
    {
        buf[i] = '\0';
        break;
    }
    buf[i] = c;
}
buf[sizeof(buf] - 1] = '\0';
 Sean04 апр. 2012 г., 06:52
Хорошая точка зрения! Это должно работать немного лучше.
 paxdiablo04 апр. 2012 г., 06:46
У вас есть небольшая проблема в конце. Допустим, первая клавиша, которую вы нажмете, будет ENTER, вы выйдете из цикла и поместите нулевой терминатор в положение 1, а не 0. Другими словами, в вашей строке будет символ мусора.

Ваш ответ на вопрос