• c语言之输入和输出


    需要引入c语言的标准库#include<stdio.h>

    一、输出:printf(也可使用putchar()输出单个字符)

    可以直接输出相关的字符串,也可以通过格式化输出相关的参数信息,比如:

    #include<stdio.h>
    #include<iostream>
    
    int main() {
        int i = 47;
        printf("hello world");
        printf("%d
    ", i);
        system("pause");
        return 0;
    }

    %d就是控制符,用“,“隔开参数,进行格式化输出时,有许多控制符,常用的有:

    1、%d 十进制有符号整数。
    
    2、%u 十进制无符号整数。
    
    3、%ld 输出long整数 。
    
    4、%s 字符串。
    
    5、%c 单个字符。
    
    6、%p 指针的值。
    
    7、%e 指数形式的浮点数。
    
    8、%x, %X 无符号以十六进制表示的整数。
    
    9、%0 无符号以八进制表示的整数。
    
    10、%g 自动选择合适的表示法。

    为什么需要控制符?

    • 01组成的代码可以表示数据,也可以表示指令;
    • 如果01表示数据的话,以不同的格式输出,就会产生不同的效果

    二、输入scanf

    在vs2019上运行scanf语句时,会报错:

    error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    这里借鉴百度百科:

    多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时黑客可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。

    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节。
    1. char buf[5]={''};
    2. scanf("%s", buf);
      如果输入1234567890,后面的部分会被写到别的空间上去。
      以上代码如果用scanf_s,第二行应改为scanf_s("%s",buf,5),表示最多读取5个字符,因为buf[5]要放''scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符。vc++2005/2008中提供了scanf_s(),在最新的VS2015中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。
    3. 读取单个字符也需要限定长度:scanf_s("%c,%c",&c1,1,&c2,1);而不能写成scanf_s("%c,%c",&c1, &c2,1, 1);否则编译器会报错。

    顺便说一下:

    #include<stdio.h>
    #include<iostream>
    
    int main() {
        int i;
        int j;
        char ch;
        printf("请输入整型i的值:
    ");
        scanf_s("%d", &i);
        printf("输入的值是:%d
    ",i);
        while ((ch = getchar()) != '
    ') 
        {
            continue;
        }
        printf("请输入整型j的值:
    ");
        scanf_s("%d", &j);
        printf("输入的值是:%d
    ", j);
        system("pause");
        return 0;
    }

    紫色的这段代码块有两个作用:

    • 如果第一次输入的是不合法的,那么整个程序就会崩溃掉。

      再加入了该代码块之后:
       

      我们可以继续为接下去的变量赋值。

    • 可以丢弃上一个scanf_s输入不正确的值。
  • 相关阅读:
    u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
    Linux 驱动框架---驱动中的中断
    Linux 驱动框架---驱动中的并发
    Linux 驱动框架---platform驱动框架
    Linux内核实现透视---软中断&Tasklet
    Linux内核实现透视---硬中断
    u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
    redis缓存的安装和使用
    ArrayList、LinkedList、Vector的区别
    Java中的IO流系统详解
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12116792.html
Copyright © 2020-2023  润新知