[C.C++] 【C/C++】C语言获取键盘输入

83 0
Honkers 6 小时前 | 显示全部楼层 |阅读模式

C语言获取键盘输入

C提供的获取键盘输入的常用标准函数有scanf()、getchar()、gets()。

从键盘获取多个字符串

从键盘获取输入的字符串可以使用scanf()、gets()、fgets()、read()(Linux)、fread()(windows)。

scanf()获取键盘输入的字符串时,当读取到空格时,就会结束读取;

gets()可以读取输入的带有空格的字符串,但是gets(0是不安全的,执行读操作时容易发生移除,存在潜在的传冲区溢出问题,在c99中已经废弃,c11中已经不支持使用了,使用fgets()代替。

需要获取多个字符串时,可以使用如下方式。

方式一,使用fgets()

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. // 获取从键盘输入的数据
  7. char buf[1024] = {0};
  8. printf("请输入数据:");
  9. char *str = fgets(buf, sizeof(buf) - 1, stdin); // fgets()是阻塞的
  10. printf("buf : %s\n", buf);
  11. printf("str : %s\n", str);
  12. printf("len : %ld\n", strlen(buf));
  13. return 0;
  14. }
复制代码

运行:

  1. 请输入数据:hello world
  2. buf : hello world
  3. str : hello world
  4. len : 12
复制代码

方式2,使用read()/fread()。Linux/Unix可以使用read()函数,传入的文件描述符参数设置为STDIN_FIFENO;windows可以使用fread(),传入的文件流参数设置为stdin。

Linux/Unix下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. // 获取从键盘输入的数据
  7. printf("请输入数据:\n");
  8. char buf[1024] = {0};
  9. ssize_t size = read(STDIN_FILENO, buf, sizeof(buf));
  10. printf("buf : %s\n", buf);
  11. printf("len : %ld\n", strlen(buf));
  12. printf("return size : %ld\n", size);
  13. return 0;
  14. }
复制代码

运行:

  1. 请输入数据:
  2. hello world
  3. buf : hello world
  4. len : 12
  5. return size : 12
复制代码

出现的问题,刚开始的代码是printf("请输入数据:");没有加换行符,然后程序运行时的结果如下,需要先输入数据,然后才会打印。网上搜索是缓冲区的问题,具体博客:linux下printf函数为什么不加\n就不能输出相关的内容 ?_Alen.Wang的博客-CSDN博客

  1. hello world
  2. 请输入数据:buf : hello world
  3. len : 12
  4. return size : 12
复制代码

windos平台:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <io.h>
  4. #include <stdlib.h>
  5. int main()
  6. {
  7. char buf[1024] = { 0 };
  8. size_t size = fread(buf, 1, 12, stdin);
  9. printf("键入:%s\n", buf);
  10. printf("ret : %d\n", size);
  11. system("pause");
  12. return 0;
  13. }
复制代码

使用fread()从键盘读取数据时,需要注意传入的第三个参数,fread()会把键盘输入的数据存入缓冲区,当输入的数据和传入的第三个参数一样多的时候(空格、tab键也算在内),fread()才会把缓冲区的数据赋给buf,并返回键入的字符数。所以不推荐使用该方式从键盘读取数据,除非要键入的数据的字符数固定。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

特级红客

关注
  • 3299
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行