在C中单独读取输入

时间:2018-01-27 21:03:38

标签: c input bufferedinputstream

我想单独阅读输入。这意味着我输入一个字符,按回车然后询问第二个输入。问题是,当程序要求我输入字符时,它同时要求两者。

这是我的代码:

#include <stdio.h>

int main(){
    printf("Enter a character \n");

    char a = 0;
    a = getchar();

    printf("You entered: %c \n",a);

    putchar(a);

    printf("\n");

    char b[2];
    puts(b);
    gets(b);

    printf("You entered: %c \n",b[0]);

    puts(b);
}

3 个答案:

答案 0 :(得分:0)

在while循环中使用for循环

char b[2];
int x;

while(b)
{
    for(x=0;x<2;x++)
    {
    printf("Enter a character: ");
    scanf("%c",b[x]);
    printf("%c",b[x]);
    }
 b++;
}return;

答案 1 :(得分:0)

您的代码中存在多个错误。

首先,这非常重要:不要再使用gets()了。这是一个 危险功能:Why is the gets function so dangerous that it should not be used?

此外,gets不再包含在C11中。

其次,你需要了解输入数据时会发生什么 键盘。当您输入文本时,您必须按 ENTER 阅读路由继续。 ENTER 也存储在输入中 buffer作为换行符('\n')。所以如果你输入 abc 了 缓冲区将包含 1

+---+---+---+----+
| a | b | c | \n |
+---+---+---+----+

这一点很重要,因为例如fgets停止阅读 遇到换行符 2 时的缓冲区。其他功能 像scanf一样可以根据使用的转换说明符读取换行符。

您使用getchar

  

man getchar

#include <stdio.h>

int fgetc(FILE *stream);

int getc(FILE *stream);
     

int getchar(void);

     

<强>描述

     

fgetc()从流中读取下一个字符,并将其作为unsigned char广告投放到int,或者在文件末尾或错误时返回EOF

     

getc()等同于fgetc(),但它可以实现为一个不止一次评估流的宏。

     

getchar()相当于getc(stdin)

从文档中可以清楚地看出getchar()读取一个字符 只要。在这一点上,重要的是要注意所有的阅读功能 fgetsscanf等将首先尝试从输入缓冲区读取 当输入缓冲区为空并且它们仍然需要继续读取时,则它们 将等待用户输入。这意味着如果先前的读取功能留下了字符 在输入缓冲区中,下一个读取函数可能不等待用户输入, 因为它可能从输入缓冲区读取。

所以,假设你输入 a ENTER 。输入缓冲区将 看起来像这样:

+---+----+
| a | \n |
+---+----+

输入缓冲区中至少包含2个字符'a'和换行符。 getchar读取第一个并返回。输入缓冲区现在看起来像这样:

+----+
| \n |
+----+

然后执行gets(b);,它会看到剩下的字符 输入缓冲区,因此它将从中读取。它读取换行符gets 停止阅读,因为gets停止阅读,因为换行符 在输入缓冲区中。 gets无需等待用户输入。如 如果用户误以为gets来电已被忽略。

最后:

char b[2];
puts(b);

这是未定义的行为,因为b是未初始化的数组,这意味着 值b[0]b[1]未定义(未知,它们可能为0,或-2323或 2829281,没人知道)。 puts期望一个字符串。在C中,字符串是序列 以值0结尾的非零字节(所谓的'\0' - 终止 字节)。 b不是字符串,因此执行puts(b)会产生未定义的行为。

<强>脚注

1 我不知道输入缓冲区是否还存储'\0' - 终止 换行后的字节。无论如何,这里并不重要。

2 前提是目标缓冲区足够大。如果没有 目标缓冲区中的空间更多,fgets无论如何都会停止读取。

答案 2 :(得分:0)

使用安全fgets代替gets

#include <stdio.h>
#include <stdlib.h>

int main(){

    char a[16];

    printf("1) Enter a character: \n");
    fgets ( a, sizeof (a), stdin );
    printf("1) You entered: %c \n",a[0]);
    puts(a);


    printf("2) Enter a character: \n");
    char b[16];
    fgets(b, sizeof(b), stdin);
    printf("2) You entered: %c \n",b[0]);

    puts(b);
}

输入:

1
B

输出:

1) Enter a character: 
1) You entered: 1 
1

2) Enter a character: 
2) You entered: B 
B