【问题标题】:C - Reading from stdin as characters are typedC - 在输入字符时从标准输入读取
【发布时间】:2012-04-04 04:23:04
【问题描述】:

如何在输入字符时或直到按下回车键或缓冲区已满(以先发生者为准)填充 80 个字符的缓冲区。

我研究了很多不同的方法,但必须按下回车键,然后输入 char* 在 80 处被截断..

谢谢。

【问题讨论】:

  • 如何找到ioctl的头文件
  • 请参阅*.com/questions/4023895/…,了解针对用户输入的强大解决方案。
  • paxdiablo 有正确的想法。他引用的解决方案使用 fgets() 似乎可以满足您的要求。

标签: c input buffer stdin


【解决方案1】:

如果您真的想要“输入时”的字符,则不能使用 C io。您必须以 unix 方式进行操作。 (或窗口方式)

#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;
}

【讨论】:

    【解决方案2】:
    #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 作为字符串后,请确保消化输入行的其余部分,以便输入流为下次使用做好准备。

    这可以通过以下代码完成(取自this documentscanf 部分):

    scanf("%*[^\n]");   /* Skip to the End of the Line */
    scanf("%*1[\n]");   /* Skip One Newline */
    

    【讨论】:

    • getchar() 返回一个 int,笨蛋。否则 EOF 将不起作用:-)
    • char-C 中的类型变量是 int-s,但我不妨让代码正确 :)
    • 字符是 not 整数,它们可能是整数类型,但这无关紧要。 getchar 返回 int 的原因是因为您必须能够返回每个 char plus 一个 eof 指示符。
    • 我认为你不需要 scanf() 的东西。如果您已经阅读到行尾或 EOF,那么您的输入流中就没有更多字符了,是吗?
    • 代码已修复。不错,因为它是我大约一年半以来编写的第一个 C 代码。
    【解决方案3】:
    #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';
    

    【讨论】:

    • 你最后有点问题。假设您按下的第一个键是 ENTER,您将退出循环并将空终止符放在位置 1 而不是 0。换句话说,您的字符串中会有一个垃圾字符。
    最近更新 更多