• 【C/C++】C语言获取键盘输入


    C语言获取键盘输入

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

    从键盘获取多个字符串

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

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

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

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

    方式一,使用fgets()

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

    运行:

    请输入数据:hello world
    buf : hello world
    
    str : hello world
    
    len : 12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    Linux/Unix下:

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

    运行:

    请输入数据:
    hello world
    buf : hello world
    
    len : 12
    return size : 12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    hello world
    请输入数据:buf : hello world
    
    len : 12
    return size : 12
    
    • 1
    • 2
    • 3
    • 4
    • 5

    windos平台:

    #include 
    #include 
    #include 
    #include 
    
    int main()
    {
    	char buf[1024] = { 0 };
    	size_t size = fread(buf, 1, 12, stdin);
    	printf("键入:%s\n", buf);
    	printf("ret : %d\n", size);
    	
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

  • 相关阅读:
    【红日靶场】vulnstack3-完整渗透过程
    javascript基础
    [TS 类型体操] 初体验之Pick 与 Omit
    【Appium UI自动化】pytest运行常见错误解决办法
    解码 xsync 的 map 实现
    【Unity】升级版·Excel数据解析,自动创建对应C#类,自动创建ScriptableObject生成类,自动序列化Asset文件
    Java集合探秘:Map和Set的魔法世界
    vscode-pretter 插件支持 styled-components 格式化问题
    通用游戏服务器架构设计
    JSP ssm 网上求职管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/127443394