C语⾔-实验室-从键盘获得⽤户输⼊
密码字符串是什么⼀分析
使⽤函数getc(stdin)可以从键盘获得⽤户输⼊
⼆实现
1 简单的输⼊回显
代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input;
while(1)
{
printf("Enter:");
input = getc(stdin);
printf("You enter:%c\n",input);
}
}
理想输出:
Enter:a
You enter:a
实际输出1
Enter:1
You enter:1
Enter:You enter:
实际输出2
Enter:asd
You enter:a
Enter:You enter:s
Enter:You enter:d
Enter:You enter:
2 getc() 从缓存中读取字符
getc()函数从缓存中读取字符,这就导致了1中理想和实际输出的差异。
从缓存读取字符的含义:⽤户在终端输⼊字符的时侯,终端并不知道⽤户输⼊了些什么,直到⽤户输⼊回车字符,终端将回车字符输⼊前的所有字符及回车字符本⾝存⼊缓存等待其他函数调⽤。此时若执⾏⼀次getc就从缓存中取出⼀个字符,并将该字符从缓存中清除。getc函数可以循环读取,直到缓存中所有字符,包括回车符都被读取完毕为⽌。若缓存被读完,getc返回EOF。
对于1的代码来说,⽤户输⼊字符a前后发⽣了如下事情:
(1)执⾏ printf("Enter:"); 界⾯输出提⽰符“Enter:”
(2)执⾏ input = getc(stdin); 等待⽤户输⼊
(3)⽤户输⼊字符'a', 缓存中包含“a”
(4)⽤户输⼊‘回车’, 缓存中包含“a、回车”,执⾏下⼀步
注意,input只能读取1个字符'a';缓存中a被读出,现在只剩“回车符”
(5)执⾏ printf("You enter:%c\n",input); 界⾯输出缓存中第⼀个字符 "You enter:a"
(6)程序回到⼀开始,执⾏printf("Enter:"); 在下⼀⾏输出提⽰符“Enter:”
(7)执⾏input = getc(stdin); 因为现在缓存中还有个“回车符”呢,所以程序认为⽤户已输⼊,input=回车,缓存被清空
(8)执⾏ printf("You enter:%c\n",input); 界⾯输出"You enter:"并换⾏
(9)程序回到⼀开始,执⾏printf("Enter:"); 在下⼀⾏输出提⽰符“Enter:”
(10)执⾏input = getc(stdin); 由于缓存是空的,所以程序执⾏到这⾥就等待⽤户输⼊。
3 如何读取完整的⽤户输⼊并输出,做⼀个getline
从2中我们可以看到,执⾏getc后,程序等待⽤户输⼊,⽤户在这⾥可以输⼊删减任何字符,直到⽤户输⼊回车符后,程序将⽤户全部的输⼊放⼊缓存,但是,此时getc只能返回缓存中的第⼀个字符,再次执⾏getc,返回第⼆个字符,⼀直到返回‘回车符’后结束,再次执⾏getc函数,则程序等待⽤户输⼊。
(在Ubuntu上实验发现,getc函数在获取⽤户输⼊时,缓存读取完毕并没有返回EOF,获得回车符之后,再次⽀持getc直接进⼊等待⽤户输⼊,所以我们只能使⽤回车符来判断⽤户的全部输⼊已读完。)
1)如何做⼀个getline
使⽤getc如何做⼀个⼀次返回全部⽤户输⼊的getline呢?⼤概过程如下:
(1)先是有个⼤循环
(2)循环⾥先执⾏getc等待⽤户输⼊
(3)⽤户输⼊完成后,getc返回第⼀个字符
(4)判断该字符是否为‘回车符’,是的话就结束循环,返回保存的字符串,否的话执⾏下⼀步
(5)将该字符保存,返回第⼆步,如果缓存⾥还有东西没输出,那就不会等⽤户输⼊,getc直接返回下⼀个字符
流程图:
2)getline的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getsline(char *result)
{
int point = 0;
int word;
while(1)
{
word = getc(stdin);//等待⽤户输⼊或从缓存中读⼀个字符
if(word != '\n')//读到回车符就认为⼀⾏指令被读完了
{
*result = word;//记录这个字符
result ++;
point ++;
}
else
{
result = '\0';//给指针末尾添加⼀个结束符
result = result - point;//让指针指回字符串的头
return0;
}
}
}
int main()
{
char *line;
line = malloc(100);
getsline(line);
printf("You enter:%s\n",line);
return0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论