精华内容
下载资源
问答
  • C语言怎么实现多个值输出

    千次阅读 2019-01-27 21:54:14
    怎么实现多个值输出C语言函数只能有一个输出,这是受当时编程方法的影响,是一个历史问题。在C语言发明前,大多数人还在用汇编语言的时候,编程效率底下,bug层出,维护困难。所以提出了一个革命性的思想,结构...

    C语言中的函数为什么只能有一个返回值输出?怎么实现多个值输出?

    C语言函数只能有一个输出,这是受当时编程方法的影响,是一个历史问题。在C语言发明前,大多数人还在用汇编语言的时候,编程效率底下,bug层出,维护困难。所以提出了一个革命性的思想,结构化程序设计,在这个思想下提出了编程函数化的理念,基于此出现了一系列的语言,C语言是其中一个发展最好的。

    为何函数为何只有一个输出。其实都源于数学。数学的函数可以有多个变量,但只有一个结果。这其实是为了数学简单化。编程也是一样,这样的编程结果明确。所以现在函数式编程还是一个很火的理念。

    但是,现实问题还是有很多不止一个输出结果的情况。好在c语言还留了一个后门。叫指针操作。通过指针操作你可以输出多个结果。这是C语言发展壮大的一个原因。也是现在C语言为人诟病的关键点。

    现代编程语言大多抛弃了指针操作,但保留了多结果输出。不过函数式编程的理念也没有丢。也就是函数只有一个返回值,但这个返回值可以包含多个结果。

    C语言的函数还真的只能有一个值返回,因为大部分情况下,我们不需要返回多个值,C语言规范中为了尽量避免程序设计的难度,就没有考虑函数的多个值的返回情况。即使有返回多个值的需求,也可以通过其它方式实现。

    总结一下,大概有四种方式:

    一. 传参数

    通过指针或引用的方式可以在函数中改变传入参数的值。
    例如在做两个数的交换时,如果用指针方式,如下:

    void swap(int *a,int *b)
    {
    	int t=*a;
    	*a=*b;
    	*b=t;
    }
    

    采用引用的方式,如下

    void swap(int &a,int *b)
    {
    	int t=a;
    	a=b;
    	b=t;
    }
    

    这样a和b其实可以看成是要返回的两个值,这种通过指针和引用的方式一般是用得最多的多值返回方式。

    二. 返回元组

    当然我们可以以数组的形式值返回,即使类型不一样也没有关系,比如要返回三种类型的值,都将它们存入到一个string类型的数组里面,将每一个类型的值当成字符串存入,在使用时解析并转化一下类型就好了。

    其实在C++11中就有tuple可以满足这个需求了,tuple中可以放不同类型的元素,并且在使用时也有对应方法获取变量值。例如:

    tuple<int,string,double> getTuple()
    {
    	int x=1;
    	string y="hello";
    	double z=2.0;
    	return make_tuple(x,y,z);
    }
    int main()
    {
    	auto t=getTuple();
    	int x=get<0>(t);
    	string y=get<1>(t);
    	double z=get<2>(t);
    	cout<<"x="<<x<<endl
    		<<"y="<<y<<endl
    		<<"z="<<z<<endl;
    	return 0;
    }
    

    返回tuple的类型,然后按下标获取对应的字段值即可。

    三. 返回字符串

    这种形式是将返回的多个字段作为字符串通过一些分隔符拼接起来作为整体返回,跟返回字符串数组差不多,只不过一个返回字符数组的形式要多一个拼接和分割操作,稍微麻烦一点,不过,在Java中这种方式用得比较多。

    四. 返回结构体

    直接定义一个结构体,这个结构体包含了所有要返回的值字段,类型可以不一样,但这样多定义了一个结构体,导致程序看起来比较冗余。

    在C/C++语言中,虽然我们不能像Python那样直接返回多个值,但通过上面的四种方式实现多个值的返回,也基本上能满足需要。

    展开全文
  • C语言逆序输出整数

    万次阅读 多人点赞 2018-12-15 17:48:36
    在很编程练习中都会遇到关于数字方面的题目,其中比较常见的一种是逆序输出整数。 下面我给出一最简单的例子。 #include &lt;stdio.h&gt; int main() { int x; int i; int sum=0; printf("...

    在很多编程练习中都会遇到关于数字方面的题目,其中比较常见的一种是逆序输出整数。

    下面我给出一个最简单的例子。

    #include <stdio.h>
    int main()
    {
        int x;
        int i;      //这里声明的i变量我没有用,本来是想用它计算有多少位数
        int sum=0;
        printf("请输入一个整数:");
        scanf("%d",&x); 
        while(x!=0) 
        { 
            sum=sum*10+x%10; 
            x/=10;
        } 
        printf("%d",sum);
        printf("\n");  //换行
        return 0; 
    }
    

    最主要的就是下面这段:

        while(x!=0) 
        { 
            sum=sum*10+x%10; 
            x/=10;
        } 

    其中 sum = sum*10+x%10;这个公式大家可以自己推算一遍。(自己找几个数,在草稿纸上算一算,然后就会明白了)


    更新(2021/4/8):

    由于部分同学评论说输入的整数后面带0的话,逆序后不会显示0,比如,输入300,逆序后只输出3,而不是003

    所以我又重新更新了一份代码,如下:

    #include <stdio.h>
    int main()
    {
        int x;
        int sum=0;
        printf("请输入一个整数:");
        scanf("%d",&x); 
        while(x!=0) 
        { 
            sum = sum*10 + x%10; 
            printf("%d",sum);   //其实就是把打印语句放到这里就OK了
            x /= 10;
        } 
    
        printf("\n");
        return 0; 
    }
    

    这个程序就可以显示后面带0的数字了,比如300,逆序后输出是003

     

    觉得有用的话点个赞哈,谢谢支持。如果想看更多其它的也可以关注我哈,一起学习交流。

    以后我会把其它的几种算法也发出来。

    展开全文
  • 最近用到了一部分C/C++的相关知识,但是C/C++的函数只能返回一个变量,如果要返回多个就很难做。经过多方面查找资料,发现如果想返回多个变量一般只有两种方法: 设置指针和地址; 构造结构体; 设置全局变量;...

    最近用到了一部分C/C++的相关知识,但是C/C++的函数只能返回一个变量值,如果要返回多个就很难做。经过多方面查找资料,发现如果想返回多个变量值一般只有两种方法:

    1. 设置指针和地址;
    2. 构造结构体;
    3. 设置全局变量;

    设置全局变量是最简单的方法,但是在有些场合并不适用。尤其是多次调用这个函数时,这个方法是特别不实用的。因此比较实用的还是前两种方法。本文以第一种方法设置指针和地址为例介绍返回多个变量值。


    一、举个例子

    有一个函数,传进来一个数组arr和一个int整数,返回值是两个数组,第一个数组对原始数组每一个值+int整数,第二个数组对原始数组每一个值-int整数。

    代码实现:

    以C为例,进行代码实现:

    #include<stdio.h>
    
    
    /*函数*/
    void function(int arr[5], int arr1[], int arr2[], int x) {
    	for (int i = 0; i < 5; i++)
    	{
    		arr1[i] = arr[i] + x;
    		arr2[i] = arr[i] - x;
    	}
    }
    
    int main() {
    	int arr[5] = { 1,2,3,4,5 };
    	int arr1[5];
    	int arr2[5];
    	int x = 1;
    	function(arr, arr1, arr2, x);
    	printf("arr1=%d,%d,%d,%d,%d\n", arr1[0], arr1[1], arr1[2], arr1[3], arr1[4]);
    	printf("arr2=%d,%d,%d,%d,%d\n", arr2[0], arr2[1], arr2[2], arr2[3], arr2[4]);
    
    }
    

    运行结果:
    arr1=2,3,4,5,6
    arr2=0,1,2,3,4

    当然,也可以用到指针:
    【由于数组名本质上是一个指针】

    *代码实现2:

    #include<stdio.h>
    
    
    /*函数*/
    void function(int* arr, int* arr1, int* arr2, int x) {
    	for (int i = 0; i < 5; i++)
    	{
    		arr1[i] = arr[i] + x;
    		arr2[i] = arr[i] - x;
    	}
    }
    
    int main() {
    	int arr[5] = { 1,2,3,4,5 };
    	int arr1[5];
    	int arr2[5];
    	int x = 1;
    	function(arr, arr1, arr2, x);
    	printf("arr1=%d,%d,%d,%d,%d\n", arr1[0], arr1[1], arr1[2], arr1[3], arr1[4]);
    	printf("arr2=%d,%d,%d,%d,%d\n", arr2[0], arr2[1], arr2[2], arr2[3], arr2[4]);
    
    }
    

    ok,以上便是全部内容了,关于指针,推荐一本书籍《C Primer Plus》,参考链接:https://book.douban.com/subject/26792521/

    最后,说一下,由于我也是一个C语言方面的小白,水平有限,错误之处在所难免,欢迎大家批评指正。

    展开全文
  • C语言之输入输出

    万次阅读 多人点赞 2019-04-30 00:03:47
    C语言中,有三函数可以用来在显示器上输出数据,它们分别是: puts():只能输出字符串,并且输出结束后会自动换行。 putchar():只能输出单个字符。 printf():可以输出各种类型的数据,在前面的很章节中都...

    输入输出

    在C语言中,有三个函数可以用来在显示器上输出数据,它们分别是:

    puts():只能输出字符串,并且输出结束后会自动换行。
    putchar():只能输出单个字符。
    printf():可以输出各种类型的数据,在前面的很多章节中都进行了介绍。

    printf() 是最灵活、最复杂、最常用的输出函数,完全可以替代 puts() 和 putchar(),大家一定要掌握。前面的章节中我们已经介绍了 printf() 的基本用法,本节将重点介绍 printf() 的高级用法。

    对于初学者,这一节的内容可能有些繁杂,如果你希望加快学习进度,尽早写出有趣的代码,也可以跳过这节,后面遇到不懂的 printf() 用法再来回顾。

    首先汇总一下前面学到的格式控制符:

    C语言 格式控制符说明
    %c输出一个单一的字符
    %hd、%d、%ld以十进制、有符号的形式输出 short、int、long 类型的整数
    %hu、%u、%lu以十进制、无符号的形式输出 short、int、long 类型的整数
    %ho、%o、%lo以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数
    %#ho、%#o、%#lo以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数
    %hx、%x、%lx
    %hX、%X、%lX
    以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。
    %#hx、%#x、%#lx
    %#hX、%#X、%#lX
    以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。
    %f、%lf以十进制的形式输出 float、double 类型的小数
    %e、%le
    %E、%lE
    以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。
    %g、%lg
    %G、%lG
    以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。
    %s输出一个字符串

    数据输出大汇总以及轻量进阶

    printf() 的高级用法

    通过前面的学习,相信你已经熟悉了 printf() 的基本用法,但是这还不足以把它发挥到极致,printf() 可以有更加炫酷、更加个性、更加整齐的输出形式。

    假如现在老师要我们输出一个 4×4 的整数矩阵,为了增强阅读性,数字要对齐,怎么办呢?我们显然可以这样做:

    #include <stdio.h>
    int main()
    {
        int a1=20, a2=345, a3=700, a4=22;
        int b1=56720, b2=9999, b3=20098, b4=2;
        int c1=233, c2=205, c3=1, c4=6666;
        int d1=34, d2=0, d3=23, d4=23006783;
        printf("%d        %d       %d       %d\n", a1, a2, a3, a4);
        printf("%d     %d      %d     %d\n", b1, b2, b3, b4);
        printf("%d       %d       %d         %d\n", c1, c2, c3, c4);
        printf("%d        %d         %d        %d\n", d1, d2, d3, d4);
        return 0;
    }
    

    运行结果:

    20        345       700       22
    56720     9999      20098     2
    233       205       1         6666
    34        0         23        23006783
    

    矩阵一般在大学的《高等数学》中会讲到,m×n 的数字矩阵可以理解为把 m×n 个数字摆放成 m 行 n 列的样子。
    看,这是多么地自虐,要敲那么多空格,还要严格控制空格数,否则输出就会错位。更加恶心的是,如果数字的位数变了,空格的数目也要跟着变。例如,当 a1 的值是 20 时,它后面要敲八个空格;当 a1 的值是 1000 时,它后面就要敲六个空格。每次修改整数的值,都要考虑修改空格的数目,逼死强迫症。

    类似的需求随处可见,整齐的格式会更加美观,让人觉得生动有趣。其实,我们大可不必像上面一样,printf() 可以更好的控制输出格式。更改上面的代码:

    #include <stdio.h>
    int main()
    {
        int a1=20, a2=345, a3=700, a4=22;
        int b1=56720, b2=9999, b3=20098, b4=2;
        int c1=233, c2=205, c3=1, c4=6666;
        int d1=34, d2=0, d3=23, d4=23006783;
        printf("%-9d %-9d %-9d %-9d\n", a1, a2, a3, a4);
        printf("%-9d %-9d %-9d %-9d\n", b1, b2, b3, b4);
        printf("%-9d %-9d %-9d %-9d\n", c1, c2, c3, c4);
        printf("%-9d %-9d %-9d %-9d\n", d1, d2, d3, d4);
        return 0;
    }
    

    输出结果:

    20        345       700       22
    56720     9999      20098     2
    233       205       1         6666
    34        0         23        23006783
    

    这样写起来更加方便,即使改变某个数字,也无需修改 printf() 语句,增加或者减少空格数目。

    **%-9d中,d表示以十进制输出,9表示最少占9个字符的宽度,宽度不足以空格补齐,-表示左对齐。综合起来,%-9d表示以十进制输出,左对齐,宽度最小为9个字符。**大家可以亲自试试%9d的输出效果。

    printf() 格式控制符的完整形式如下:

    %[flag][width][.precision]type

    [ ] 表示此处的内容可有可无,是可以省略的。

    1) type 表示输出类型,

    比如 %d、%f、%c、%lf,type 就分别对应 d、f、c、lf;再如,%-9d中 type 对应 d。

    type 这一项必须有,这意味着输出时必须要知道是什么类型。

    2) width 表示最小输出宽度,

    也就是至少占用几个字符的位置;例如,%-9d中 width 对应 9,表示输出结果最少占用 9 个字符的宽度。

    当输出结果的宽度不足 width 时,以空格补齐(如果没有指定对齐方式,默认会在左边补齐空格);当输出结果的宽度超过 width 时,width 不再起作用,按照数据本身的宽度来输出。

    下面的代码演示了 width 的用法:

    #include <stdio.h>
    int main(){
        int n = 234;
        float f = 9.8;
        char c = '@';
        char *str = "http://c.biancheng.net";
        printf("%10d%12f%4c%8s", n, f, c, str);
        return 0;
    }
    

    运行结果:

           234    9.800000   @http://c.biancheng.net
    

    对输出结果的说明:

    n 的指定输出宽度为 10,234 的宽度为 3,所以前边要补上 7 个空格。
    f 的指定输出宽度为 12,9.800000 的宽度为 8,所以前边要补上 4 个空格。
    str 的指定输出宽度为 8,“http://c.biancheng.net” 的宽度为 22,超过了 8,所以指定输出宽度不再起作用,而是按照 str 的实际宽度输出。

    3) .precision 表示输出精度,也就是小数的位数。

    当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
    当小数部分的位数小于 precision 时,会在后面补 0。

    另外,.precision 也可以用于整数和字符串,但是功能却是相反的:
    用于整数时,.precision 表示最小输出宽度。与 width 不同的是,整数的宽度不足时会在左边补 0,而不是补空格。
    用于字符串时,.precision 表示最大输出宽度,或者说截取字符串。当字符串的长度大于 precision 时,会截掉多余的字符;当字符串的长度小于 precision 时,.precision 就不再起作用。

    请看下面的例子:

    #include <stdio.h>
    int main(){
        int n = 123456;
        double f = 882.923672;
        char *str = "abcdefghi";
        printf("n: %.9d  %.4d\n", n, n);
        printf("f: %.2lf  %.4lf  %.10lf\n", f, f, f);
        printf("str: %.5s  %.15s\n", str, str);
        return 0;
    }
    

    运行结果:

    n: 000123456  123456
    f: 882.92  882.9237  882.9236720000
    str: abcde  abcdefghi
    

    对输出结果的说明:

    对于 n,.precision 表示最小输出宽度。n 本身的宽度为 6,当 precision 为 9 时,大于 6,要在 n 的前面补 3 个 0;当 precision 为 4 时,小于 6,不再起作用。
    对于 f,.precision 表示输出精度。f 的小数部分有 6 位数字,当 precision 为 2 或者 4 时,都小于 6,要按照四舍五入的原则截断小数;当 precision 为 10 时,大于 6,要在小数的后面补四个 0。
    对于 str,.precision 表示最大输出宽度。str 本身的宽度为 9,当 precision 为 5 时,小于 9,要截取 str 的前 5 个字符;当 precision 为 15 时,大于 9,不再起作用。

    4) flag 是标志字符。

    例如,%#x中 flag 对应 #,%-9d中 flags 对应-。下表列出了 printf() 可以用的 flag:

    标志字符含 义
    --表示左对齐。如果没有,就按照默认的对齐方式,默认一般为右对齐。
    +用于整数或者小数,表示输出符号(正负号)。如果没有,那么只有负数才会输出符号。
    空格用于整数或者小数,输出值为正时冠以空格,为负时冠以负号
    #对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。

    注意: 对于小数(%f / %e / %g),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。

    请看下面的例子:

    #include <stdio.h>
    int main(){
        int m = 192, n = -943;
        float f = 84.342;
        printf("m=%10d, m=%-10d\n", m, m);  //演示 - 的用法
        printf("m=%+d, n=%+d\n", m, n);  //演示 + 的用法
        printf("m=% d, n=% d\n", m, n);  //演示空格的用法
        printf("f=%.0f, f=%#.0f\n", f, f);  //演示#的用法
        return 0;
    }
    

    运行结果:

    m=       192, m=192      
    m=+192, n=-943
    m= 192, n=-943
    f=84, f=84.
    

    对输出结果的说明:

    当以%10d输出 m 时,是右对齐,所以在 192 前面补七个空格;当以%-10d输出 m 时,是左对齐,所以在 192 后面补七个空格。
    m 是正数,以%+d输出时要带上正号;n 是负数,以%+d输出时要带上负号。
    m 是正数,以% d输出时要在前面加空格;n 是负数,以% d输出时要在前面加负号。
    %.0f表示保留 0 位小数,也就是只输出整数部分,不输出小数部分。默认情况下,这种输出形式是不带小数点的,但是如果有了#标志,那么就要在整数的后面“硬加上”一个小数点,以和纯整数区分开。

    printf() 不能立即输出的问题

    printf() 有一个尴尬的问题,就是有时候不能立即输出,请看下面的代码:

    #include<stdio.h>
    #include<unistd.h>
    int main()
    {
        printf("C语言中文网");
        sleep(5);  //程序暂停5秒钟
        printf("http://c.biancheng.net\n");
        return 0;
    }
    

    这段代码使用了两个 printf() 语句,它们之间有一个 sleep() 函数,该函数的作用是让程序暂停 5 秒,然后再继续执行。sleep() 是 Linux 和 Mac OS 下特有的函数,不能用于 Windows。当然,Windows 下也有功能相同的暂停函数,叫做 Sleep(),稍后我们会讲解。

    在 Linux 或者 Mac OS 下运行该程序,会发现第一个 printf() 并没有立即输出,而是等待 5 秒以后,和第二个 printf() 一起输出了.

    我们不妨修改一下代码,在第一个 printf() 的最后添加一个换行符,如下所示:
    printf(“C语言中文网\n”);

    再次编译并运行程序,发现第一个 printf() 首先输出(程序运行后立即输出),等待 5 秒以后,第二个 printf() 才输出.

    为什么一个换行符\n就能让程序的表现有天壤之别呢?按照通常的逻辑,程序运行后第一个 printf() 应该立即输出,而不是等待 5 秒以后再和第二个 printf() 一起输出,也就是说,第二种情形才符合我们的惯性思维。然而,第一种情形该如何理解呢?

    其实,这一切都是输出缓冲区(缓存)在作怪!

    从本质上讲,printf() 执行结束以后数据并没有直接输出到显示器上,而是放入了缓冲区,直到遇见换行符\n才将缓冲区中的数据输出到显示器上。

    以上测试的是 Linux 和 Mac OS,我们不妨再测试一下 Windows,请看下面的代码:

    #include<stdio.h>
    #include<Windows.h>
    int main()
    {
        printf("C语言中文网");
        Sleep(5000);  //程序暂停5秒钟
        printf("http://c.biancheng.net\n");
        return 0;
    }
    

    在 Windows 下,想让程序暂停可以使用 Windows.h 头文件中的 Sleep() 函数(S要大写),它和 Linux 下的 sleep() 功能相同。不过,sleep() 要求的时间单位是秒,而 Sleep() 要求的时间单位是毫秒,1 秒等于 1000 毫秒。这段代码中,我们要求程序暂停 5000 毫秒,也即 5 秒。

    编译并运行程序,会发现第一个 printf() 首先输出(程序运行后立即输出),等待 5 秒以后,第二个 printf() 才输出,请看下面的动画演示:

    在第一个 printf() 的最后添加一个换行符,情况也是一样的,第一个 printf() 从来不会和第二个 printf() 一起输出。

    你看,Windows 和 Linux、Mac OS 的情况又不一样。这是因为,Windows 和 Linux、Mac OS 的缓存机制不同.

    要想破解 printf() 输出的问题,必须要了解缓存,它能使你对输入输出的认识上升到一个更高的层次,以后不管遇到什么疑难杂症,都能迎刃而解。可以说,输入输出的“命门”就在于缓存。

    总结

    对于初学者来说,上面讲到的 printf() 用法已经比较复杂了,基本满足了实际开发的需求,相信大家也需要一段时间才能熟悉。但是,受到所学知识的限制,本文也未能讲解 printf() 的所有功能,后续我们还会逐步深入。

    printf() 的这些格式规范不是“小把戏”,优美的输出格式随处可见,例如,dos 下的 dir 命令,会整齐地列出当前目录下的文件,这明显使用了右对齐,还指定了宽度。

    使用scanf从键盘输入数据

    程序是人机交互的媒介,有输出必然也有输入,前面我们讲解了如何将数据输出到显示器上,本章我们开始讲解如何从键盘输入数据。在C语言中,有多个函数可以从键盘获得用户输入:

    scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
    getchar()、getche()、getch():这三个函数都用于输入单个字符。
    gets():获取一行数据,并作为字符串处理。
    

    scanf() 是最灵活、最复杂、最常用的输入函数,但它不能完全取代其他函数,大家都要有所了解。

    本节我们只讲解 scanf(),其它的输入函数将在下节讲解。

    scanf()函数

    scanf 是 scan format 的缩写,意思是格式化扫描,也就是从键盘获得用户输入,和 printf 的功能正好相反。

    我们先来看一个例子:

    #include <stdio.h>
    int main()
    {
        int a = 0, b = 0, c = 0, d = 0;
        scanf("%d", &a);  //输入整数并赋值给变量a
        scanf("%d", &b);  //输入整数并赋值给变量b
        printf("a+b=%d\n", a+b);  //计算a+b的值并输出
        scanf("%d %d", &c, &d);  //输入两个整数并分别赋值给c、d
        printf("c*d=%d\n", c*d);  //计算c*d的值并输出
        return 0;
    }
    

    运行结果:

    12↙
    60↙
    a+b=72
    10 23↙
    c*d=230
    

    ↙表示按下回车键。
    从键盘输入12,按下回车键,scanf() 就会读取输入数据并赋值给变量 a;本次输入结束,接着执行下一个 scanf() 函数,再从键盘输入 60,按下回车键,就会将 60 赋值给变量 b,都是同样的道理。

    第 8 行代码中,scanf() 有两个以空格分隔的%d,后面还跟着两个变量,这要求我们一次性输入两个整数,并分别赋值给 c 和 d。注意"%d %d"之间是有空格的,所以输入数据时也要有空格。对于 scanf(),输入数据的格式要和控制字符串的格式保持一致。

    其实 scanf 和 printf 非常相似,只是功能相反罢了:

    scanf("%d %d", &a, &b);  // 获取用户输入的两个整数,分别赋值给变量 a 和 b
    printf("%d %d", a, b);  // 将变量 a 和 b 的值在显示器上输出
    

    它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带一个&符号。&称为取地址符,也就是获取变量在内存中的地址。

    我们已经知道数据是以二进制的形式保存在内存中的,字节(Byte)是最小的可操作单位。为了便于管理,我们给每个字节分配了一个编号,使用该字节时,只要知道编号就可以,就像每个学生都有学号,老师会随机抽取学号来让学生回答问题。字节的编号是有顺序的,从 0 开始,接下来是 1、2、3……

    下图是 4G 内存中每个字节的编号(以十六进制表示):

    这个编号,就叫做地址(Address)。int a;会在内存中分配四个字节的空间,我们将第一个字节的地址称为变量 a 的地址,也就是&a的值。对于前面讲到的整数、浮点数、字符,都要使用 & 获取它们的地址,scanf 会根据地址把读取到的数据写入内存。

    我们不妨将变量的地址输出看一下:

    #include <stdio.h>
    int main()
    {
        int a='F';
        int b=12;
        int c=452;
        printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
       return 0;
    }
    

    输出结果:

    &a=0x18ff48, &b=0x18ff44, &c=0x18ff40

    %p是一个新的格式控制符,它表示以十六进制的形式(带小写的前缀)输出数据的地址。如果写作%P,那么十六进制的前缀也将变成大写形式。

    图:a、b、c 的内存地址
    注意:这里看到的地址都是假的,是虚拟地址,并不等于数据在物理内存中的地址。虚拟地址是现代计算机因内存管理的需要才提出的概念
    再来看一个 scanf 的例子:

    #include <stdio.h>
    int main()
    {
        int a, b, c;
        scanf("%d %d", &a, &b);
        printf("a+b=%d\n", a+b);
        scanf("%d   %d", &a, &b);
        printf("a+b=%d\n", a+b);
        scanf("%d, %d, %d", &a, &b, &c);
        printf("a+b+c=%d\n", a+b+c);
       
        scanf("%d is bigger than %d", &a, &b);
        printf("a-b=%d\n", a-b);
        return 0;
    }
    

    运行结果:

    10    20↙
    a+b=30
    100 200↙
    a+b=300
    56,45,78↙
    a+b+c=179
    25 is bigger than 11↙
    a-b=14
    

    第一个 scanf() 的格式控制字符串为"%d %d",中间有一个空格,而我们却输入了10 20,中间有多个空格。第二个 scanf() 的格式控制字符串为"%d %d",中间有多个空格,而我们却输入了100 200,中间只有一个空格。这说明 scanf() 对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。

    第三个 scanf() 的控制字符串为"%d, %d, %d",中间以逗号分隔,所以输入的整数也要以逗号分隔。

    第四个 scanf() 要求整数之间以is bigger than分隔。

    用户每次按下回车键,程序就会认为完成了一次输入操作,scanf() 开始读取用户输入的内容,并根据格式控制字符串从中提取有效数据,只要用户输入的内容和格式控制字符串匹配,就能够正确提取。

    本质上讲,用户输入的内容都是字符串,scanf() 完成的是从字符串中提取有效数据的过程。

    连续输入

    在本节第一段示例代码中,我们一个一个地输入变量 a、b、c、d 的值,每输入一个值就按一次回车键。现在我们改变输入方式,将四个变量的值一次性输入,如下所示:

    12 60 10 23↙
    a+b=72
    c*d=230
    

    可以发现,两个 scanf() 都能正确读取。合情合理的猜测是,第一个 scanf() 读取完毕后没有抛弃多余的值,而是将它们保存在了某个地方,下次接着使用。

    如果我们多输入一个整数,会怎样呢?

    12 60 10 23 99↙
    a+b=72
    c*d=230
    

    这次我们多输入了一个 99,发现 scanf() 仍然能够正确读取,只是 99 没用罢了。

    如果我们少输入一个整数,又会怎样呢?

    12 60 10↙
    a+b=72
    23↙
    c*d=230
    

    输入三个整数后,前两个 scanf() 把前两个整数给读取了,剩下一个整数 10,而第三个 scanf() 要求输入两个整数,一个单独的 10 并不能满足要求,所以我们还得继续输入,凑够两个整数以后,第三个 scanf() 才能读取完毕。

    从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据。如果缓冲区中的数据符合 scanf() 的要求,那么就读取结束;如果不符合要求,那么就继续等待用户输入,或者干脆读取失败。

    注意,如果缓冲区中的数据不符合 scanf() 的要求,要么继续等待用户输入,要么就干脆读取失败,上面我们演示了“继续等待用户输入”的情形,下面我们对代码稍作修改,演示“读取失败”的情形。

    #include <stdio.h>
    int main()
    {
        int a = 1, b = 2, c = 3, d = 4;  //修改处:给变量赋予不同的初始值
        scanf("%d", &a);
        scanf("%d", &b);
        printf("a=%d, b=%d\n", a, b);
        scanf("%d %d", &c, &d);
        printf("c=%d, d=%d\n", c, d);
       
        return 0;
    }
    

    运行结果:

    12 60 a10↙
    a=12, b=60
    c=3, d=4
    

    前两个整数被正确读取后,剩下了 a10,而第三个 scanf() 要求输入两个十进制的整数,a10 无论如何也不符合要求,所以只能读取失败。输出结果也证明了这一点,c 和 d 的值并没有被改变。

    这说明 scanf() 不会跳过不符合要求的数据,遇到不符合要求的数据会读取失败,而不是再继续等待用户输入。

    总而言之,正是由于缓冲区的存在,才使得我们能够多输入一些数据,或者一次性输入所有数据,这可以认为是缓冲区的一点优势。然而,缓冲区也带来了一定的负面影响,甚至会导致很奇怪的行为,请看下面的代码:

    #include <stdio.h>
    int main()
    {
        int a = 1, b = 2;
        scanf("a=%d", &a);
        scanf("b=%d", &b);
        printf("a=%d, b=%d\n", a, b);
        return 0;
    }
    

    输入示例:

    a=99↙
    a=99, b=2
    

    输入a=99,按下回车键,程序竟然运行结束了,只有第一个 scanf() 成功读取了数据,第二个 scanf() 仿佛没有执行一样,根本没有给用户任何机会去输入数据。

    如果我们换一种输入方式呢?

    a=99b=200↙
    a=99, b=200
    

    这样 a 和 b 都能够正确读取了。注意,a=99b=200中间是没有任何空格的。

    肯定有好奇的小伙伴又问了,如果a=99b=200两个数据之间有空格又会怎么样呢?我们不妨亲试一下:

    a=99 b=200↙
    a=99, b=2
    

    你看,第二个 scanf() 又读取失败了!在前面的例子中,输入的两份数据之前都是有空格的呀,为什么这里不能带空格呢,真是匪夷所思。好吧,这个其实还是跟缓冲区有关系。

    要想破解 scanf() 输入的问题,一定要学习缓冲区,它能使你对输入输出的认识上升到一个更高的层次,以后不管遇到什么疑难杂症,都能迎刃而解。可以说,输入输出的“命门”就在于缓冲区。

    输入其它数据

    除了输入整数,scanf() 还可以输入单个字符、字符串、小数等,请看下面的演示:

    #include <stdio.h>
    int main()
    {
        char letter;
        int age;
        char url[30];
        float price;
       
        scanf("%c", &letter);
        scanf("%d", &age);
        scanf("%s", url); //可以加&也可以不加&
        scanf("%f", &price);
       
        printf("26个英文字母的最后一个是 %c。\n", letter);
        printf("C语言中文网已经成立%d年了,网址是 %s,开通VIP会员的价格是%g。\n", age, url, price);
        return 0;
    }
    

    运行示例:

    z↙
    6↙
    http://c.biancheng.net↙
    159.9↙
    26个英文字母的最后一个是 z。
    C语言中文网已经成立6年了,网址是 http://c.biancheng.net,开通VIP会员的价格是159.9。
    

    scanf() 和 printf() 虽然功能相反,但是格式控制符是一样的,单个字符、整数、小数、字符串对应的格式控制符分别是 %c、%d、%f、%s。
    对读取字符串的说明
    在字符串的两种定义形式,它们分别是:

    char str1[] = "http://c.biancheng.net";
    char *str2 = "C语言中文网";
    

    这两种形式其实是有区别的,第一种形式的字符串所在的内存既有读取权限又有写入权限,第二种形式的字符串所在的内存只有读取权限,没有写入权限。printf()、puts() 等字符串输出函数只要求字符串有读取权限,而 scanf()、gets() 等字符串输入函数要求字符串有写入权限,所以,第一种形式的字符串既可以用于输出函数又可以用于输入函数,而第二种形式的字符串只能用于输出函数。

    另外,对于第一种形式的字符串,在[ ]里面要指明字符串的最大长度,如果不指明,也可以根据=后面的字符串来自动推算,此处,就是根据"http://c.biancheng.net"的长度来推算的。但是在前一个例子中,开始我们只是定义了一个字符串,并没有立即给它赋值,所以没法自动推算,只能手动指明最大长度,这也就是为什么一定要写作char url[30],而不能写作char url[]的原因。

    读者还要注意第 11 行代码,这行代码用来输入字符串。上面我们说过,scanf() 读取数据时需要的是数据的地址,整数、小数、单个字符都要加&取地址符,这很容易理解;但是对于此处的 url 字符串,我们并没有加 &,这是因为,字符串的名字会自动转换为字符串的地址,所以不用再多此一举加 & 了。当然,你也可以加上,这样虽然不会导致错误,但是编译器会产生警告.

    关于字符串,后续章节我们还会专门讲解,这里只要求大家会模仿,不要彻底理解,也没法彻底理解。

    最后需要注意的一点是,scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串,请看下面的例子:

    #include <stdio.h>
    int main()
    {
        char author[30], lang[30], url[30];
        scanf("%s %s", author, lang);
        printf("author:%s \nlang: %s\n", author, lang);
        scanf("%s", url);
        printf("url: %s\n", url);
        return 0;
    }
    

    运行示例:

    YanChangSheng C-Language↙
    author:YanChangSheng
    lang: C-Language
    http://c.biancheng.net http://biancheng.net↙
    url: http://c.biancheng.net
    

    对于第一个 scanf(),它将空格前边的字符串赋值给 author,将空格后边的字符串赋值给 lang;很显然,第一个字符串遇到空格就结束了,第二个字符串到了本行的末尾结束了。

    或许第二个 scanf() 更能说明问题,我们输入了两个网址,但是 scanf() 只读取了一个,就是因为这两个网址以空格为分隔,scanf() 遇到空格就认为字符串结束了,不再继续读取了。

    scanf() 格式控制符汇总

    格式控制符说明
    %c读取一个单一的字符
    %hd、%d、%ld读取一个十进制整数,并分别赋值给 short、int、long 类型
    %ho、%o、%lo读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
    %hx、%x、%lx读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
    %hu、%u、%lu读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
    %f、%lf读取一个十进制形式的小数,并分别赋值给 float、double 类型
    %e、%le读取一个指数形式的小数,并分别赋值给 float、double 类型
    %g、%lg既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
    %s读取一个字符串(以空白符为结束)

    输入字符和字符串

    输入单个字符

    输入单个字符当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%c,上节已经讲到了。本节我们重点讲解的是 getchar()、getche() 和 getch() 这三个专用的字符输入函数,它们具有某些 scanf() 没有的特性,是 scanf() 不能代替的。

    1) getchar()

    最容易理解的字符输入函数是 getchar(),它就是scanf("%c", c)的替代品,除了更加简洁,没有其它优势了;或者说,getchar() 就是 scanf() 的一个简化版本。

    下面的代码演示了 getchar() 的用法:

    #include <stdio.h>
    int main()
    {
        char c;
        c = getchar();
        printf("c: %c\n", c);
        return 0;
    }
    

    输入示例:

    @↙
    c: @
    

    你也可以将第 4、5 行的语句合并为一个,从而写作:
    char c = getchar();

    2) getche()

    getche() 就比较有意思了,它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和 scanf()、getchar() 的最大区别。请看下面的代码:

    #include <stdio.h>
    #include <conio.h>
    int main()
    {
        char c = getche();
        printf("c: %c\n", c);
        return 0;
    }
    

    输入示例:
    @c: @

    输入@后,getche() 立即读取完毕,接着继续执行 printf() 将字符输出,所以没有按下回车键程序就运行结束了。

    注意,getche() 位于 conio.h 头文件中,而这个头文件是 Windows 特有的,Linux 和 Mac OS 下没有包含该头文件。换句话说,getche() 并不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

    3) getch()

    getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche() 相同。getch() 的特别之处是它没有回显,看不到输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。

    回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。

    getch() 使用举例:

    #include <stdio.h>
    #include <conio.h>
    int main()
    {
        char c = getch();
        printf("c: %c\n", c);
        return 0;
    }
    

    输入@后,getch() 会立即读取完毕,接着继续执行 printf() 将字符输出。但是由于 getch() 没有回显,看不到输入的@字符,所以控制台上最终显示的内容为c: @

    注意,和 getche() 一样,getch() 也位于 conio.h 头文件中,也不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

    输入字符串

    输入字符串当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%s,上节已经讲到了;本节我们重点讲解的是 gets() 这个专用的字符串输入函数,它拥有一个 scanf() 不具备的特性。

    gets() 的使用也很简单,请看下面的代码:

    #include <stdio.h>
    int main()
    {
        char author[30], lang[30], url[30];
        gets(author);
        printf("author: %s\n", author);
        gets(lang);
        printf("lang: %s\n", lang);
        gets(url);
        printf("url: %s\n", url);
       
        return 0;
    }
    

    运行结果:

    YanChangSheng↙
    author: YanChangSheng
    C-Language↙
    lang: C-Language
    http://c.biancheng.net http://biancheng.net↙
    url: http://c.biancheng.net http://biancheng.net
    

    gets() 是有缓冲区的,每次按下回车键,就代表当前输入结束了,gets() 开始从缓冲区中读取内容,这一点和 scanf() 是一样的。gets() 和 scanf() 的主要区别是:

    1. scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
    2. gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。

    也就是说**,gets() 能读取含有空格的字符串,而 scanf() 不能**。

    总结

    1. C语言中常用的从控制台读取数据的函数有五个,它们分别是 scanf()、getchar()、getche()、getch() 和 gets()。其中 scanf()、getchar()、gets() 是标准函数,适用于所有平台;getche() 和 getch() 不是标准函数,只能用于 Windows。

    2. scanf() 是通用的输入函数,它可以读取多种类型的数据。

    3. getchar()、getche() 和 getch() 是专用的字符输入函数,它们在缓冲区和回显方面与 scanf() 有着不同的特性,是 scanf() 不能替代的。

    4. gets() 是专用的字符串输入函数,与 scanf() 相比,gets() 的主要优势是可以读取含有空格的字符串。

    5. scanf() 可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch() 和 gets() 每次只能读取一份特定类型的数据,不能一次性读取多份数据。

    c语言魅力真的很大,体验一下linux下的c语言编程更爽.

    展开全文
  • c语言||函数返回多个值

    千次阅读 2020-03-07 13:11:20
    由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调...
  • C语言输出整数的最大

    千次阅读 2021-06-10 19:40:02
    C语言整数求最大 对于求三数中最大的一,首先定义三整型变量a,b,c。最后把最大赋给a,也就是三变量互相交换使得a成为最大的那个。 int a,b,c; //定义三整型变量 scanf("%d%d%d",&a,&b,&...
  • C语言如何让一个函数返回多个值

    万次阅读 2018-12-13 22:11:08
    一、实现方法 1.用指针和数组(数组名本质上是一个指针); 2.或是你根本就不要返回,设置一个宏观变量...3.返回多个指针怎么办呢?————使用指向指针的指针返回。 二、代码展示: 1.用指针和数组(数组名本...
  • C语言 计算并输出sin(x)的值,其中x=0,PI/6.PI/4,PI/3,PI/2(其中PI是圆周率派) 可不可以先定义x等于这几个值,然后尽可能简洁的求出当x等于这些值时的sin值,并一一输出
  • C语言-输出数的最大数

    千次阅读 2021-02-25 14:24:57
    1.两数 int a, b, c; printf("请输入两数字:\n"); scanf("%d%d", &a, &b); c=a > b ?a: b; printf("最大数为%d\n", c); 2.三数 int a, b, c, d, e; printf("请输入三数字:\n"); scanf("%d...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    C语言 42.C语言是一种计算机高级语言。 43.C语言允许直接访问物理地址,能进行位操作。 44.C语言是结构化程序设计语言 45.c程序要通过编译,连接...50.C语言的每语句的最后必须有一分号 51.C语言本身没有输入...
  • C语言——多个数中求最大

    千次阅读 2021-06-30 23:39:00
    清华大学出版社 由上述简单的实操题,我们可以学习到: 如果求解多个数中最大,可以采用循环结构中 for 语句,将最大存储于max中。 那如何将这些成绩保存呢?如何将小于最大的数值输出呢?我们采用数组——...
  • C语言的键盘输入和屏幕输出

    千次阅读 2019-06-10 10:14:29
    C语言中的字符常量是用单引号括起来的一字符。例如,‘a’是字符常量,而a则是一标识符。再如,‘3’表示一字符常量,而3则表示一整数。 把字符放在一对单引号的做法,适用于多数可打印字符,但不适用于某些...
  • c语言进行数据的输入多输出

    万次阅读 2016-04-04 02:42:02
    c语言中有一标准输入函数,即:scanf函数,它可以读取输入的任意格式类型的数据。scanf函数也有返回值,返回类型为int类型,它返回成功读入的项目的个数。如果它没有读取任何项目(当它期望一数字而您却键入了一...
  • 04-C语言如何返回两个甚至多个值

    千次阅读 2020-10-14 15:28:56
    #include <stdio.h> //C的返回值只能是0个或者1个...//如何返回两个值? //rt1和rt2称为输出参数 void Two(int *rt1,int *rt2) { *rt1 = 10; *rt2 = 20; printf("%d%d\n",*rt1,*rt2); } int main() { int a,b;
  • C语言返回多个值

    千次阅读 2015-03-24 08:38:57
    百度上下载的,不知道源自谁。。。 笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数。编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在...或者把需要返回多个值
  • c语言代码:n数中取最大
  • C语言-输出指定数的质数

    千次阅读 2019-03-11 23:01:10
    原文链接 ...NULL 对指针而言相当于 0 ,在声明指针的时候最好将其初始化为 NULL 防止其乱指,在后面使用过程中 造成内存覆盖等问题。 声明需要的变量: // 用来存储所有的质数 unsigned long long ...
  • 判断并输出数abc 中的最大 (C语言)

    千次阅读 多人点赞 2019-12-30 17:49:30
    #include<stdio.h>... printf("请输入三整数:"); scanf("%d%d%d",&a,&b,&c);//%d%d%d格式则输入时是a b c %d,%d,%d格式则输入a,b,c if(a>b) max=a; else max=b; if(c>...
  • C语言一次性给多个变量赋值

    千次阅读 2020-08-02 23:30:38
    scanf("%d%d%d",a,b,c); 而不是scanf("%d,%d,%d",a,b,c); 这里要注意那里是没有逗号的
  • C语言连续生成多个随机数(可限制范围)

    万次阅读 多人点赞 2020-01-15 11:28:59
    生成随机数 在现实中我们经常用到随机数,可怎么实现呢,且听小乔慢慢...函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,而这个数值由一个公式计算得来,这个值在电脑启动后是不变的。在这里我...
  • C语言程序设计第五版 谭浩强 第五版课后答案

    万次阅读 多人点赞 2019-06-16 00:27:29
    谭浩强 C语言程序设计第五版 第4章课后答案 3.求两正整数m和n,求其最大公约数和最小公倍数。 #include<stdio.h> void main() { int m, n, t, i, a = 1; scanf("%d%d", &m, &n); if (m < n) ...
  • C语言 逆序输出数组元素

    千次阅读 2020-11-13 16:58:08
    示例代码如下: #include <stdio.h> void main(){ int a[9]={1,2,3,4,5,6,7,8,9},i; for(i=8;i>=0;i--){ printf("%d\n",a[i]); } }
  • c语言printf输出语句A printf() function is a standard library function, that is used to print the text and value on the standard output screen. Here, we will evaluate the expression – where a printf()...
  • 此处用简单数组实现功能(判断10数中的最大数并输出)。 /*初学C语言,有不足还请指正*/ #include<stdio.h> #include"math.h" #include"conio.h" int main() // 输入数据,输出最大数。 { while (1) { ...
  • 最近使用OpenCV来搞图像算法的工程化应用,采用C语言作为编程语言。 遇到了一棘手的问题: 我将算法都封装成不同的函数,在matlab中调用该函数很简单,如下: %matlab 函数示例 [im,para]=function dip_func(Iin);...
  • C语言 基本输入输出函数

    万次阅读 多人点赞 2016-11-03 15:07:57
    1 几组常见的输入输出函数在stdio.h头文件中内置了几种输入输出函数,如下列出: printf 与 scanf getchar 与 putchar gets 与 puts 相比之下 printf 与 scanf的功能最为强大,但操作稍显复杂,后两种则功能简单,...
  • 如题,C语言怎么求多个数的最大啊,输入任意个数字。。。。。。。。。。。。。
  • 有一天,我正愉悦地写着函数,突然,我想让这个函数返回多个值, 一下子懵逼了呀 无奈之下,只好翻阅资料,整理了这篇文章 本文的结构如下: 1.三种函数返回多个返回值的方法: ​     1.全局变量法(慎...
  • C语言输入和输出

    千次阅读 多人点赞 2020-03-03 11:07:45
    文章目录一、数据输入二、数据输出三、断章取义四、printf输出1、输出描述性的文字2、输出整数3、输出字符4、输出浮点数5、输出字符串6、输出多个内容7、示例(book12.c)五、scanf输入1、输入整数2、输入字符3、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,814
精华内容 77,525
关键字:

c语言同时输出多个值

c语言 订阅