我想单独阅读输入。这意味着我输入一个字符,按回车然后询问第二个输入。问题是,当程序要求我输入字符时,它同时要求两者。
这是我的代码:
#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);
}
答案 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()
读取一个字符
只要。在这一点上,重要的是要注意所有的阅读功能
fgets
,scanf
等将首先尝试从输入缓冲区读取
当输入缓冲区为空并且它们仍然需要继续读取时,则它们
将等待用户输入。这意味着如果先前的读取功能留下了字符
在输入缓冲区中,下一个读取函数可能不等待用户输入,
因为它可能从输入缓冲区读取。
所以,假设你输入 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