【问题标题】:Reading a single character in C在 C 中读取单个字符
【发布时间】:2013-01-03 09:42:53
【问题描述】:

我正在尝试从控制台读取一个字符(在 while 循环内)。但它不止一次读取。

输入:

a

输出:

char : a  char : char : '

代码:

while(..)
{
    char in;
    scanf("%c",&in);
}

我怎样才能只读“a”?

【问题讨论】:

    标签: c scanf


    【解决方案1】:
    scanf("%c",&in);
    

    留下一个换行符,在下一次迭代中使用。

    改成:

    scanf(" %c",&in); // Notice the whitespace in the format string
    

    告诉 scanf 忽略空格。

    或

    scanf(" %c",&in);
    getchar(); // To consume the newline 
    

    【讨论】:

    • 其实我想创建一个字符数组。你知道吗? (输入大小不确定)。谢谢!
    • @vkeles: 1) 分配一个初始大小的数组,比如n 使用malloc 2) 将字符读入数组,直到它不超过n 3) 如果@ 987654327@ 字符被读取,并且您希望使用realloc 读取两倍以上的数组大小。一般采用这种方法是为了避免调用 realloc 过于频繁。否则,您可以使用您喜欢的大小进行重新分配。
    【解决方案2】:

    要只读取一个字符,请改用getchar:

    int c = getchar();
    if (c != EOF)
      printf("%c\n", c);
    

    【讨论】:

      【解决方案3】:

      在scanf("%c",&in); 中,您可以在%c 之后添加换行符\n 以吸收多余的字符

      scanf("%c\n",&in);
      

      【讨论】:

      • 我无法得到 scanf("%c\n", &in);正常工作。但是,这确实有效: scanf(" %[^\n]%*c", &in); %*c 告诉 scanf 读取并丢弃输入缓冲区中剩余的任何内容,包括换行符。在 scanf 中使用的第一个 " 之后包含一个空格始终是一个好习惯。但是如果您想保留用户输入的白色(例如,在输入其他文本之前的空格),那么在 scanf 中省略第一个 " 之后的空格()。
      【解决方案4】:

      你可以这样做。

      char *ar;
      int i=0;
      char c;
      while((c=getchar()!=EOF)
         ar[i++]=c;
      ar[i]='\0';
      

      这样,你创建了一个字符串,但实际上它是一个字符数组。

      【讨论】:

      • 请注意,此示例没有为字符数组分配任何内存,也没有设置 ar 的初始值,因此它将写入内存中有效的随机位置,覆盖那里的任何内容。
      • 谢谢。我真的忘记保持初始化指针变量的习惯了
      【解决方案5】:

      你总是可以使用char a = fgetc (stdin);。非常规,但与getchar() 一样工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 2013-04-01
        相关资源
        最近更新 更多