精华内容
下载资源
问答
  • 在C语言中,没有字符串类型,那它是怎么表示字符串呢? 由于字符串是一系列单个字符的组合,所以它...那我们怎么给变量name赋值呢,最简单的办法,就是字符串常量。字符串常量的写法和我们平时的写法还是一样的,...

      在C语言中,没有字符串类型,那它是怎么表示字符串呢? 由于字符串是一系列单个字符的组合,所以它用char 类型的数组来表示字符串,在数组中,一个数组元素存放一个char类型字符。

    char name[40];

      name 变量就可以存放字符串了,并且最多只能存储40个字符。那我们怎么给变量name赋值呢,最简单的办法,就是用字符串常量。字符串常量的写法和我们平时的写法还是一样的,用双引号括起来,如“Zing went the strings of my heart”;  字符串常量写好后,就可以像下面一样进行赋值

    name=”Zing went the strings of my heart”; 

      赋值成功后,它在内存中的表示形式如下:

      

      你可能已经注意到数组末尾位置有一个字符\0, 它是空字符,表示字符串的结束。C语言中,字符串一定以空字符结束,这意味着声明数组的容量必须比它要存储的字符串的长度多1;在这里,str字符串的长度是40, 我们只能存储39个字符, 剩下一位留给空字符。

      strlen() 函数则是获取到字符串的长度,strlen(str) 结果为33, 它包含在string.h 头文件中,所以使用这个方法之前,要先引进这个头文件 #include<string.h>

    #include <stdio.h>
    #include <string.h>  // 引进头文件string.h
    
    int main()
    {
        char str[40] = "Zing went the strings of my heart";
        printf("%u", strlen(str));        // 调用strlen 获取字符串的长度
        return 0;
    }

      顺便说一下常量的定义:

      1,使用预处理器定义常量。在程序的头部#define PI 3.1415  在编译时,程序中的所有常量PI,都会被替换成3.1415. 这一过程也称之为编译时替换。

      2,const 也可以用来声明常量,const  double PI = 3.1415; 

    #include <stdio.h>
    #define PI  3.1415     // 定义常量
    
    int main()
    {
        const int r = 5;
        printf("%f %d", PI, r);
        return 0;
    }

      Printf()函数: 打印字符串,它的格式如下:

      Printf(格式化字符串,待打印的参数1,待打印的参数2,.....待打印的参数n), 看一下下面这段打印代码,

    printf(“The %d person ate %f berry pies. \n”, number, pies);

      格式化字符串就是双引号括起来的内容,为什么叫格式化字符串,因为它里面有%d, %f, 这样的转换说明,就是后面要打印的项,以什么格式进行输出。%d表示以整数时行输出,%f 以浮点数进行输出。

      还有其它几个常用的格式说明,

      %e或 %E,以e记数法来表示浮点数

      %s        字符串

      %%        打印一个百分号

      %c:       单个字符

      这样我们在使用printf 的时候,就比较清楚了,我们要打印多少项,就要把它们在格式化字符串后面依次列出,同时在格式化字符串中匹配对应的格式说明,这里一定要注意,格式字符串中的转换说明的个数一定要和待打印项的个数一致,它们一一匹配。当然,如果只是打印字符串,就直接写要打印的字符串就好了,就不用转换说明了。Printf(“Hello World”)

       转换说明修饰符: 就是在% 和d 之前可以加说明,表示对待打印项进一步的修饰。如%.2f 就是表示小数点后面保留两位小数。 %5d表示整数的宽度为5,但是如果指定的字宽小于原有数的字宽,字段宽度会自动增加。

    #include <stdio.h>
    #define PI  3.1415     // 定义常量
    
    int main()
    {
        const int r = 5;
        int num = 100;
        // PI小数点后面成了2位,r占了5个字宽,num 虽然设了两个字宽,但这还是占3个
        printf("%.2f %5d %2d", PI, r, num);
        return 0;
    }

      打印较长的字符,printf()可以接受多个字符串,编译的时候,会自动它拉连接到一起,如 printf(“this is a ”   “best person”)

      Scanf()读取输入的内容

      当我们使用键盘进行输入的时候,输入的永远是字符,比如我们输入2018, 我们实际上是依次输入4个字符2,0,1,8, 所以我们要告诉scanf,他表示的是数字,所以还是用到了格式说明。scanf()的第一个参数,格式转换说明,后面则是读取的值要存入的变量。格式转换说明,和printf()函数一致

    scanf(“%d %d”, &num1, &num2);  //一定要注意变量前面的&符号,变量存储的是基本数据类型时,读取的时候,前面一定要加&

      当用键盘输入多个数值时,中间用空格隔开,空格前面的就会赋给第一个参数,空格后面就会赋值给第二个参数。但这里要注意字符串的读取,scanf() 函数读取我们输入的字符串时,在遇到第1个空白(空格、制表符,换行符)时,就不会再读取输入。 scanf 去读取 angela palains 时,它只会读取 angela.   

    转载于:https://www.cnblogs.com/SamWeb/p/7478042.html

    展开全文
  • 在C语言中,我们通常会遇到一个问题,就是在给函数起名字的时候怎么起呢,大部分人汉语拼音,高端一些的人士会英文,但是这也避免不了会有名字冲突的情况发生,一旦名字冲突那整个工程都将无法进行编译。...

    一、命名空间

    在C语言中,我们通常会遇到一个问题,就是在给函数起名字的时候怎么起呢,大部分人用汉语拼音,高端一些的人士会用英文,但是这也避免不了会有名字冲突的情况发生,一旦名字冲突那整个工程都将无法进行编译。在C++中,引用入了命名空间的这个概念来解决这个问题,它最主要的功能就是解决了名字相互冲突的问题。

    1、命名空间的定义

    定义一个命名空间,需要用到 namespace 这个关键字,后面跟上 这个命名空间的名字,然后用 { }将里面的内容圈起来;

    namespace A {
    	int Add(int left,int right) {
    		return left + right;
    	}
    }
    namespace B {
    	int Add(int left,int right) {
    		return left + right;
    	}
    }

    这里定义了两个命名空间 一个叫做 A 一个叫做 B,但是值得注意的是:

    • 在C++中允许存在命名空间的嵌套;
    • 在C++中同一个工程中,允许存在多个相同名称的命名空间,编译器最后会把他们合并成一个命名空间;
    //命名空间的嵌套
    namespace C {
    	int Add(int left, int right) {
    		return left + right;
    	}
    	namespace D {
    		int Sub(int left,int right) {
    			return left + right;
    		}
    	}
    }

    注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中;

    2、命名空间的使用

    命名空间的使用有三种方式:

    1. 加命名空间名称及作用域限定符号(以命名空间 A 为例):A::Add()
    2. 使用using将命名空间中的成员引入(以命名空间 C 为例):using C::D
    3. 使用 using namesapce 将命名空间引入 (以命名空间 B 为例):using namesapce B
    //1
    int main() {
    	printf("%d",A::Add(1,2));
    	return 0;
    }
    //2
    using C::D;
    int main() {
    	printf("%d",Add(1,2));
    	return 0;
    }
    //3
    using namespace B;
    int main() {
    	printf("%d",Add(1,2));
    	return 0;
    }

    二、C++中的输出&输出

    在C++中使用 cout标准输出(控制台)和 cin标准输入(键盘),注意必须要包含头文件 <iostream> 以及 其所对应的命名空间 std;

    #include<iostream>
    using namespace std;
    
    int main(){
        int a;
        cin  >> a >> endl;
        cout << a << endl;
        return 0;
    }

    三、缺省参数

    缺省参数就是定义或者声明函数的时候为函数的参数指定一个默认值,在调用该函数的时候,如果没有指定实参则采用该默认的值,否则使用是定的实参。

    void TestFun1(int a = 10) {
    	cout << a << endl;
    }
    int main() {
    	TestFun1();        //使用默认值10进行输出
    	TestFun1(2);       //使用给定的实参2进行输出
    	return 0;
    }

    缺省参数有两种情况:1、全缺省参数;2、半缺省参数;

    //全缺省参数
    void TestFun2(int a = 1,int b = 2,int c = 3) {
    	cout << a << endl;
    	cout << b << endl;
    	cout << c << endl;
    }
    //半缺省参数
    void TestFun2(int a, int b = 2, int c = 3) {
    	cout << a << endl;
    	cout << b << endl;
    	cout << c << endl;
    }
    

    需要注意的是:

    1. 半缺省参数必须从右向左来给出,中间不能间隔;
    2. 缺省参数不能再函数的定义和声明中同时出现;
    3. 缺省值必须是常量或者全局变量;
    4. C语言不支持!!

    四、函数重载

    函数重载通俗的理解就是在同一个作用域中声明几个功能类似名字相同的函数,但是这些函数的形参列表(参数个数、参数类型、参数顺序)是不相同的,由编译器决定最后实际允许过程中调用哪个函数。

    int Add(int a,int b) {
    	return a + b;
    }
    double Add(double a, double b) {
    	return a + b;
    }

    但是注意!:不能使用函数的返回值类型来进行函数重载,比如:

    short Sub(short a,short b) {
    	return a + b;
    }
    int Sub(short a,short b) {
    	return a + b;
    }
    

    还有,函数重载在C语言中是不可行的!主要原因是因为函数名字修饰规则不相同,在C语言中名字修饰规则很简单,只是通过在函数的名字前面添加下划线 如:“_Add()”,而在C++中则由特殊的命名方式(包含了函数的名字以及参数类型等)

    //在Visaul Stdio 2013中
    int Add(int left,int right);               //?Add@@YAHHH@Z
    double Add(double left,double right);      //?Add@@YANNN@Z
    double Add(int left,double right);         //?Add@@YANHN@Z

    对于名字修饰这个问题,其实主要原因是一个程序要运行起来主要是:预处理、编译、汇编、链接。这几个步骤,在编译的过程中,将函数、变量的名字重新改编的机制,简单的来说就是编译器为了区分各个函数的一种做法。

     

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

    2020-02-08 21:55:05
    文章目录ANSI C定义了标准(不同系统通用)的I/O函数输入验证(用户交互更友好)单字符I/O getchar() putchar() (宏)有缓冲输入(C语言标准) VS 无缓冲输入完全缓冲I/O VS 行缓冲I/O好多概念实际上本质上都是一段...


    我很震惊第八章还要学习输入输出,因为前面几章一上来就在讲输入输出,而且每一个程序都要用到输入输出,所以我以为输入输出就告一段落了·····
    是我想太多
    这一章是专门讲输入输出,涉及一些更深层次的概念,比如有无缓冲的输入,重定向的具体含义,文件,有些知识点从来没有听说过,有些却虽然听说过还小小接触过但是仍然不明内里,所以还是静下心来探索一番,有些知识或者视角真的很振奋人心,比如键盘输入和屏幕显示实际上都是文件(对于程序而言是这样)

    之前接触过的执行I/O任务的函数有4个:printf(),scanf(),putchar(),getchar(),但是我刚知道,后两个实际上并不是函数,而是宏!!!用于预处理器使用的!!!!他俩在用法上很像函数,一直不懂宏是什么,很激动,thrilled

    ANSI C定义了标准(不同系统通用)的I/O函数

    在这里插入图片描述

    输入验证(用户交互更友好)

    以前没把输入验证当回事,写程序遇到过一次要求验证输入的,觉得有点用,但是还没养成习惯
    在这里插入图片描述

    单字符I/O getchar() putchar() (宏)

    在这里插入图片描述

    这两个宏和stdio.h关联的

    有缓冲输入(C语言标准) VS 无缓冲输入

    之前完全不知道输入还有缓冲的概念,不过还比较好理解,也挺有意思,很好奇无缓冲输入的用武之地(一些实时的交互式程序)到底是怎么样使用
    在这里插入图片描述
    总之buffer是一段内存区域,键盘输入的字符先放在那里,而不是直接发给程序使用,像是一个中间站,键盘输入和程序的中间站,等buffer满了再一次性发给程序,两个好处:

    • 减少发送次数,节约时间,提高效率
    • 如果写错了字符,可以删除重写,那么重写的是buffer的内容,buffer内容是正确的才发送给程序,降低了错误率

    在这里插入图片描述
    ANSI C没有提供无缓冲输入的标准方式

    完全缓冲I/O VS 行缓冲I/O

    在这里插入图片描述
    在这里插入图片描述

    突然觉得,word好像用的就是和缓冲区类似的机制实现保存内容的。用户对文件进行编辑和修改,这些输入先存在缓冲区,只有CTRL+S保存或者缓冲区满或者word自动保存的计时到了时,才刷新缓冲区,即把新编辑和新的修改存储到文件上,文件在硬盘中。这样可以减少和硬盘的交互次数。

    好多概念实际上本质上都是一段内存区域

    最近的学习中发现好多概念实际上本质上都是一段内存区域,比如变量实际上代表的就是内存,变量只是提供了一种用符号表示内存的方式;文件也是内存,这个我还挺震惊了,毕竟一说文件,想到的就是纸质的····(我好low),很难联想到他实际是内存区域,不管是什么后缀的,存了什么内容,本质上在计算机里都是占用了一段内存,我们看的时候用屏幕和友好的界面显示出来了而已,实际上他们只是磁盘里的一段内存;

    怎么结束键盘和文件的输入 & 流

    之前几章的编程示例都是用一个特殊字符标志着输入的结束,常常使用#或者q,通过while语句

    while((ch=getchar())!='#')
    

    这是一种结束键盘输入的方式,但是这样子井号这个字符就不能出现在我的输入字符中了,显然不是一个通用的好办法

    一般程序有两种输入数据的来源:键盘输入和文件输入。但是这两种情况,实际上又是同一种情况,因为C程序实际上处理的是流·······不管你是键盘来的字符流,还是问价来的字符流,程序并不关心,C程序只是把他们当做流做统一处理就好了。有两个流:stdin流(键盘输入),stdout流(屏幕输出)

    键盘输入

    C程序其实把键盘输入和屏幕输出也是当做文件的。所以只需要研究文件如何结束输入就好了。

    文件输入

    在这里插入图片描述

    文件就是内存。文件就是内存。文件是内存。

    现在知道为啥本科学Linux时候文件系统要讲那么久了,但是当时还是觉得很难听懂,大概就是没有理解这个关键概念:文件实际上是内存。

    关于文件的操作就四个:打开,读取,写入,关闭

    在这里插入图片描述

    这段话只能理解60%,灵活性是说实现方法多种多样,办法多的意思;直接调用操作系统软件的函数是比较底层的I/O,而不和操作系统打交道的,就是较高层面的,
    但我不懂为什么标准I/O函数包可以屏蔽掉OS,不需要和OS互动,那么他和OS之间的转换和沟通是不是还需要谁来完成呢?
    我也不明白C如何处理不同系统的差异以让用户享受一致统一的UI?
    希望以后能渐渐明白

    在这里插入图片描述
    好像是I/O函数在处理,即使我输入的只是换行符,I/O函数会自动给我转换为回车符加换行符的组合,以使得OS知道我到底想做啥。平时编程很难想到底层的有关OS的东西诶,基本都只管自己的程序的输入输出对不对,想都没想全都是OS在做事。

    那么不同OS都有哪些差异呢?举个栗子?
    都是一些很具体的处理方式,OS的任务是一样的,但是不同OS的办法不太一样而已
    在这里插入图片描述在这里插入图片描述

    键盘输入和屏幕输出都是文件,但C程序处理的是流而不是文件

    在这里插入图片描述

    如何标志文件的结束?

    用特殊字符标记 (CRTL+Z ,EOF)

    像之前我们编程用#一样一样的,但是CRTL+Z是在文本中绝不会使用的字符,EOF是一个值,文本中只会用字符,不会用到值,所以这两种方法都不会遇到我们之前担心的那种问题:文本中要用这个特殊字符咋整?
    在这里插入图片描述
    上图可以清晰说明文件是内存区域存储的信息。

    在这里插入图片描述在这里插入图片描述

    #include <stdio.h>
    int main(void)
    {
        int ch;
        while((ch=getchar())!=EOF)
            putchar(ch);
        return 0;
    }
    

    在这里插入图片描述

    qwehhinn
    qwehhinn
    EOF
    EOF
    -1
    -1
    ^Z
    

    实际上使用CTRL+Z产生EOF仍然是操作系统大哥在帮助我们,看来我们这些在APP层写程序的仔还是要更加深入的了解操作系统大哥到底为我们做了多少默默无闻的事情啊
    在这里插入图片描述

    重定向

    重定向实际上还是说的输入输出流,和输入流,输出流两个关键概念联系密切。流就是程序查找输入和输出的位置,把stdin流和stdout流赋给文件则用文件输入或输出,赋给标准输入输出则用键盘屏幕。

    Unix,Linux,Windows系统都支持重定向,没有重定向的系统还会用C去模仿重定向。
    在这里插入图片描述

    重定向运算符 < >

    在这里插入图片描述
    C语言把文件和IO设备当在一个层次哦!!!
    在这里插入图片描述在这里插入图片描述

    重定向示例 Windows 命令行

    程序源代码

    #include <stdio.h>
    int main(void)
    {
        int ch;
        while((ch=getchar())!=EOF)
            putchar(ch);
        return 0;
    }
    

    编译生成exe文件后,从命令行进入exe文件的路径,新建了一个txt文件,写了一些字符作为程序的文件输入,然后在命令行使用组合

    C:\Users\wulimmya>cd C:\Users\wulimmya\Documents\MyCCode\MyC
    
    C:\Users\wulimmya\Documents\MyCCode\MyC>bin
    'bin' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    
    C:\Users\wulimmya\Documents\MyCCode\MyC>cd bin
    
    C:\Users\wulimmya\Documents\MyCCode\MyC\bin>cd Debug
    
    C:\Users\wulimmya\Documents\MyCCode\MyC\bin\Debug>MyC < input > output
    系统找不到指定的文件。
    
    C:\Users\wulimmya\Documents\MyCCode\MyC\bin\Debug>MyC < input.txt > output
    
    C:\Users\wulimmya\Documents\MyCCode\MyC\bin\Debug>
    

    新建的文件没有后缀,用记事本打开看到了正确输出
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    更友好的用户界面设计(交互式程序)

    示例 猜数字(本例的算法很烂)

    #include <stdio.h>
    int main(void)
    {
        int num, guess=1;
        char ch;
        printf("Enter an integer from 1 to 100. I will try to guess.\n"
               "Respond with a y if my guess is right and a n if I'm wrong.\n");
        scanf("%d", &num);
        printf("Is your number %d?\n", guess);
        while((ch=getchar())!='y')
        {
            if(ch=='\n')
                continue;//如果不加这句,则换行符字符也会让程序输出一句猜测,结果就是每输入一个字符会导致两次猜测
            printf("Is your number %d?\n", ++guess);
        }
        printf("I know I can do it!\n");
        return 0;
    }
    
    Enter an integer from 1 to 100. I will try to guess.
    Respond with a y if my guess is right and a n if I'm wrong.
    5
    Is your number 1?
    n
    Is your number 2?
    n
    Is your number 3?
    n
    Is your number 4?
    n
    Is your number 5?
    y
    I know I can do it!
    

    但是如果回应时多敲一个字符就不行了,多敲几个就会得到多几个猜测,明显这种跳过换行符的做法是不太好的,下面我们跳过所有字符,只根据换行符来执行猜测就好了

    Enter an integer from 1 to 100. I will try to guess.
    Respond with a y if my guess is right and a n if I'm wrong.
    4
    Is your number 1?
    no
    Is your number 2?
    Is your number 3?
    no sir
    Is your number 4?
    Is your number 5?
    Is your number 6?
    Is your number 7?
    Is your number 8?
    Is your number 9?
    

    也可以写为下面这样,上面是跳过换行符,实际上上面的方法是不合乎原理的,因为输入换行符就是为了告诉程序我输入结束了,该程序采取动作了,所以更好地方法是跳过非换行符

    #include <stdio.h>
    int main(void)
    {
        int num, guess=0;
        char ch;
        printf("Enter an integer from 1 to 100. I will try to guess.\n"
               "Respond with a y if my guess is right and a n if I'm wrong.\n");
        scanf("%d", &num);
    
        while((ch=getchar())!='y')
        {
            if(ch!='\n')
                continue;
            printf("Is your number %d?\n", ++guess);
        }
        printf("I know I can do it!\n");
        return 0;
    }
    
    Enter an integer from 1 to 100. I will try to guess.
    Respond with a y if my guess is right and a n if I'm wrong.
    5
    Is your number 1?
    n
    Is your number 2?
    n
    Is your number 3?
    n
    Is your number 4?
    n
    Is your number 5?
    y
    I know I can do it!
    

    看,已经克服了刚才的问题,新问题来了,由于只用了字符y和输入的第一个!!(getchar只考虑第一个字符)字符作对比,如果交互者灵活应答,程序就出错了,因为程序把首字母y当做对,其他不管什么字母都是错,所以在改进一下

    Enter an integer from 1 to 100. I will try to guess.
    Respond with a y if my guess is right and a n if I'm wrong.
    5
    Is your number 1?
    n
    Is your number 2?
    no
    Is your number 3?
    no no no
    Is your number 4?
    oh no
    Is your number 5?
    it is!
    Is your number 6?
    

    原来我上面写错了一点,就是不需要用户输入数字

    #include <stdio.h>
    int main(void)
    {
        int num, guess=1;
        char ch;
        printf("Pick an integer from 1 to 100. I will try to guess.\n"
               "Respond with a y if my guess is right and a n if I'm wrong.\n");
        printf("Is your number %d?\n", guess);
        while((ch=getchar())!='y')
        {
    
            if(ch=='n')
                printf("Is your number %d?\n", ++guess);
            else
                printf("I only understand y and n.\n");
            while(getchar()!='\n')
                continue;
    
        }
        printf("I know I can do it!\n");
        return 0;
    }
    
    Pick an integer from 1 to 100. I will try to guess.
    Respond with a y if my guess is right and a n if I'm wrong.
    Is your number 1?
    no
    Is your number 2?
    no
    Is your number 3?
    no sir
    Is your number 4?
    sir no
    I only understand y and n.
    n
    Is your number 5?
    it is
    I only understand y and n.
    yes
    I know I can do it!
    

    混合字符和数字输入

    在这里插入图片描述

    示例

    /*输入一个字符c和两个整数(m,n),显示出m行n列这个字符*/
    #include <stdio.h>
    void display(char, int, int);
    int main()
    {
        int ch;
        int row, col;
        printf("Enter a character and two integers.\n");
        while((ch=getchar())!='\n')
        {
            scanf("%d %d", &row, &col);
            display(ch, row, col);
            printf("Enter another character and two integers.\n");
            printf("Enter a newline to quit.\n");
        }
        printf("Bye!\n");
        return 0;
    }
    
    void display(char ch, int row, int col)
    {
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
                putchar(ch);
            putchar('\n');
        }
    }
    
    Enter a character and two integers.
    c 2 3
    ccc
    ccc
    Enter another character and two integers.
    Enter a newline to quit.
    Bye!
    

    在这里插入图片描述

    我是想不出来办法解决了,整个脑袋晕晕的,什么也没法思考,只想叹气,全是疲惫和皱眉,

    在这里插入图片描述

    修改上面换行符的问题

    /*输入一个字符c和两个整数(m,n),显示出m行n列这个字符*/
    #include <stdio.h>
    void display(char, int, int);
    int main()
    {
        int ch;
        int row, col;
        printf("Enter a character and two integers.\n");
        while((ch=getchar())!='\n')
        {
            scanf("%d %d", &row, &col);
            display(ch, row, col);
            while(getchar()!='\n')
                continue;
            printf("Enter another character and two integers.\n");
            printf("Enter a newline to quit.\n");
        }
        printf("Bye!\n");
        return 0;
    }
    
    void display(char ch, int row, int col)
    {
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
                putchar(ch);
            putchar('\n');
        }
    }
    
    Enter a character and two integers.
    q 2 3
    qqq
    qqq
    Enter another character and two integers.
    Enter a newline to quit.
    s 2 4 5
    ssss
    ssss
    Enter another character and two integers.
    Enter a newline to quit.
    
    Bye!
    

    但是如果不小心输入了浮点数,即输入错误
    如果输入不到2个整数,scanf会继续等你输入
    如果一开始输入了一个浮点数和一个整数,程序不会打印
    但是如果开始是对的,程序就会打印之那两个整数

    Enter a character and two integers.
    q 1
    
    2
    qq
    Enter another character and two integers.
    Enter a newline to quit.
    e 2.1 3
    ee
    ee
    Enter another character and two integers.
    Enter a newline to quit.
    q 1.2 2
    qq
    Enter another character and two integers.
    Enter a newline to quit.
    
    Enter a character and two integers.
    w 1.2 2
    
    Enter another character and two integers.
    Enter a newline to quit.
    a 4 5
    aaaaa
    aaaaa
    aaaaa
    aaaaa
    Enter another character and two integers.
    Enter a newline to quit.
    
    Enter a character and two integers.
    q 2 3
    qqq
    qqq
    Enter another character and two integers.
    Enter a newline to quit.
    w 2.3 4
    www
    www
    Enter another character and two integers.
    Enter a newline to quit.
    

    继续改进,在这里插入图片描述

    /*输入一个字符c和两个整数(m,n),显示出m行n列这个字符*/
    #include <stdio.h>
    void display(char, int, int);
    int main()
    {
        int ch;
        int row, col;
        printf("Enter a character and two integers.\n");
        while((ch=getchar())!='\n')
        {
            if(scanf("%d %d", &row, &col)!=2)
                break;
            display(ch, row, col);
            while(getchar()!='\n')
                continue;
            printf("Enter another character and two integers.\n");
            printf("Enter a newline to quit.\n");
        }
        printf("Bye!\n");
        return 0;
    }
    
    void display(char ch, int row, int col)
    {
        for(int i=1;i<=row;i++)
        {
            for(int j=1;j<=col;j++)
                putchar(ch);
            putchar('\n');
        }
    }
    
    Enter a character and two integers.
    Q 3 2
    QQ
    QQ
    QQ
    Enter another character and two integers.
    Enter a newline to quit.
    E 3.1 2
    Bye!
    

    输入验证

    x是long类型,输入3.4,scanf("%ld", &x)==1的值竟然是是true!!!

    所以 while(scanf("%ld", &x)!=1)是拦不住浮点数输入的,只能挡住字符输入,即当你输入字符能够进入这个while循环,而输入浮点数不会进入这个循环

    #include <stdio.h>
    long get_long(void);
    int main()
    {
        long x;
        char ch;
        printf("Please enter a long variable.\n");
        while(scanf("%ld", &x)==1)
        {
            printf("x is %ld\n", x);
            while((ch=getchar())!='\n')
                putchar(ch);
            printf(" is not an integer.\n Please enter an ");
            printf("integer value, such as 23, -56 or 3:\n");
        }
        printf("Your input is %ld\n", x);
        return 0;
    }
    

    可以看到,输入的3被读取为整数,而后面的.4被留在缓冲流中

    Please enter a long variable.
    3.4
    x is 3
    .4 is not an integer.
     Please enter an integer value, such as 23, -56 or 3:
    
    Please enter a long variable.
    234
    x is 234
     is not an integer.
     Please enter an integer value, such as 23, -56 or 3:
    

    这说明scanf("%ld", &x)==1会把浮点数输入的整数部分读入,而小数点以及其后的数字被留在输入的缓冲流中,真是······
    注释掉那句显示x的(那是为了测试上面的错误)

    #include <stdio.h>
    long get_long(void);
    int main()
    {
        long x;
        char ch;
        printf("Please enter a long variable.\n");
        while(scanf("%ld", &x)!=1)
        {
            //printf("x is %ld\n", x);
            while((ch=getchar())!='\n')
                putchar(ch);
            printf(" is not an integer.\n Please enter an ");
            printf("integer value, such as 23, -56 or 3:\n");
        }
        printf("Your input is %ld\n", x);
        return 0;
    }
    

    可以看到只有输入字符才会进入while循环以进行输入错误的处理,而输入浮点数不会进入,而是执行while后面的语句

    Please enter a long variable.
    a
    a is not an integer.
     Please enter an integer value, such as 23, -56 or 3:
    2.3
    Your input is 2
    

    示例 用户界面友好(主要是解决好输入的可能错误),模块化编程

    用不同函数/模块实现输入验证和求和的功能

    #include <stdio.h>
    #include <stdbool.h>
    const long MAX = +10000000L;
    const long MIN = -10000000L;
    long get_long(void);//验证输入是一个整数
    bool bad_limits(long begin, long end, long low, long high);//验证范围上下限符合要求
    long sum_squares(long a, long b);//求整数a,b之间的整数的平方和
    int main()
    {
        long start, stop, sum;//用户指定的范围
        printf("This program computes the sum of the squares of the integers in a range.\n"
               "The lower bound should not be less than %ld.\n"
               "The upper bound should not be greater than %ld\n"
               "Enter the limits( enter 0 for both limits to quit:)\n"
               "lower limit:\n", MIN, MAX);
        start = get_long();
        printf("upper limit:\n");
        stop = get_long();
        while(start!=0 || stop!=0)
        {
           if(bad_limits(start, stop, MIN, MAX))
            printf("Enter again!");
           else
           {
               sum = sum_squares(start, stop);
               printf("The sum of integers in the range of %ld and %ld is %ld\n\n", start, stop, sum);
           }
            printf("lower limit:\n");
            start = get_long();
            printf("upper limit:\n");
            stop = get_long();
        }
        printf("Done!\n");
        return 0;
    }
    
    long get_long(void)
    {
        long x;
        char ch;
        //printf("Please enter a long variable.\n");
        while(scanf("%ld", &x)!=1)
        {
            while((ch=getchar())!='\n')
                putchar(ch);
            printf(" is not an integer.\n Please enter an ");
            printf("integer value, such as 23, -56 or 3:\n");
        }
        return x;
    }
    
    bool bad_limits(long begin, long end, long low, long high)
    {
        bool not_good = false;
        if(begin>end)
        {
            printf("%ld isn't smaller than %ld.\n", begin, end);
            not_good = true;
        }
        if(low>high)
        {
            printf("%ld isn't smaller than %ld.\n", low, high);
            not_good = true;
        }
    
        if(begin<low || end<low)
        {
            printf("Values must be %ld or greater.\n", low);
            not_good = true;
        }
    
        if(begin>high || end>high)
        {
            printf("Values must be %ld or less.\n", high);
            not_good = true;
        }
            return not_good;
    }
    long sum_squares(long a, long b)
    {
        long sum=0;
        for(long i=a;i<=b;i++)
            sum += i*i;
        return sum;
    }
    
    This program computes the sum of the squares of the integers in a range.
    The lower bound should not be less than -10000000.
    The upper bound should not be greater than 10000000
    Enter the limits( enter 0 for both limits to quit:)
    lower limit:
    1
    upper limit:
    3
    The sum of integers in the range of 1 and 3 is 14
    
    lower limit:
    10
    upper limit:
    100
    The sum of integers in the range of 10 and 100 is 338065
    
    lower limit:
    0
    upper limit:
    0
    Done!
    

    输入是多个字符组成的字节流

    在这里插入图片描述

    厉害的scanf 转换小能手

    把字符根据转换说明转换为各种数据类型,棒棒的
    在这里插入图片描述

    菜单(UI的不可或缺的一部分)

    在这里插入图片描述
    在这里插入图片描述

    以后用C++和Java写点图形界面的菜单玩玩

    我还没做过这种类似的分析,写出伪代码,想到什么事情适合用什么语句

    在这里插入图片描述

    换行符 kind of a pain in the ass(成功分析并解决了换行符带来的麻烦,呼呼,好有成就感!)

    在这里插入图片描述在这里插入图片描述

    本示例gets me so high (这局和换行符终于玩清楚了)

    有一周多没有这样的成就感了,通过自己努力分析,调试,找到问题并解决,这是一种真正的开心,嘴角上扬的毫无阻力,内心和表情高度愉悦的一致,头也不晕了,心情无比轻松,比看剧什么的都有意思多了!解决了一个工作和学习的难题所带来的的成就感简直太治愈了!!我要继续攻坚克难,追求被虐后才能获得的这种很high high的feel!被虐很久才会有这么一次放松,并且虐的越惨,就越放松!我的喜好真表态。

    #include <stdio.h>
    char get_choice();
    char get_first();
    void count(int i);
    int get_integer();
    int main()
    {
        char ch;
        int i;
        while((ch = get_choice())!='q')
        {
            switch(ch)
        {
        case 'a':
            printf("Buy low, sell high.\n");break;
        case 'b':
            putchar('\a');break;
        case 'c':
            printf("Count how far? Enter an integer.\n");
            i = get_integer();
            count(i);
            break;
        default:
            printf("\\n is like a pain in the ass.\n");break;
        }
        }
        if(ch=='q')
            printf("Bye!\n");
        return 0;
    }
    
    char get_choice()
    {
        char choice;
        printf("Enter the letter of your choice:\n");
        printf("a. advice       b. bell\nc. count        q. quit\n");
        while(((choice=get_first()) != 'a') && (choice!='b') && (choice!='c') && (choice!='q'))
            {
                printf("Please respond with a, b, c or q.\n");
                printf("Enter the letter of your choice:\n");
                printf("a. advice       b. bell\nc. count       q. quit\n");
            }
        return choice;
    }
    
    char get_first()
    {
        char first;
        first=getchar();
        while(getchar()!='\n')
            continue;
        return first;
    }
    void count(int i)
    {
        for(int j=1;j<=i;j++)
            printf("%d\n", j);
    }
    int get_integer()
    {
        int i;
        char ch;
        while(scanf("%d", &i)!=1)
        {
            while((ch=getchar())!='\n')
                putchar(ch);
            printf(" is not an integer. Please enter an integer, such as 3, -4, 80:\n");
        }
        getchar();//输入整数后的换行符必须清理掉,不然后面get_choice会get换行符
        return i;
    }
    

    完全正确的菜单

    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    a
    Buy low, sell high.
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    b
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    c
    Count how far? Enter an integer.
    2
    1
    2
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    a
    Buy low, sell high.
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    b
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    c
    Count how far? Enter an integer.
    3
    1
    2
    3
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    c
    Count how far? Enter an integer.
    3
    1
    2
    3
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    q
    Bye!
    

    遇到的几个问题及其解决

    • 1.菜单显示后输入a没问题,但是输入b,c,q都完全没反应,调试的时候输入b,c,q还无法return回去,我一脸蒙蔽不知为何一度十分痛苦,多按几次换行符还输出了Please respond with a, b, c or q
      如下:
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    a
    Buy low, sell high.
    Enter the letter of your choice:
    a. advice       b. bell
    c. count        q. quit
    b
    c
    q
    
    
    Please respond with a, b, c or q.
    Enter the letter of your choice:
    a. advice       b. bell
    c. count       q. quit
    
    
    
    
    
    
    
    
    Please respond with a, b, c or q.
    Enter the letter of your choice:
    a. advice       b. bell
    c. count       q. quit
    
    

    经过思索,原来这是因为我犯了一个巨大的错误!
    我把while的表达式写成了

    //最终正确版本
    while(((choice=get_first()) != 'a') && (choice!='b') && (choice!='c') && (choice!='q'))
    //原始错误版本
    while(((choice=get_first()) != 'a') || ((choice=get_first())!='b') || ((choice=get_first())!='c') || ((choice=get_first())!='q'))
    

    原始错误版本有两个巨大错误:一是竟然写的或???很低级的错误,就不说了;上面的现象是我把或改为与后,出现的错误现象。

    二是我他妈竟然调用了4次get_first函数······what the fuck???我在想什么???难怪输入几次换行符才进入到while语句里输出Please respond with a, b, c or q,因为人家调用了4次函数。所以后面三个字符根本不用再调用了···
    由于菜单显示后我输入a,while(((choice=get_first()) != ‘a’) && ((choice=get_first())!=‘b’) && ((choice=get_first())!=‘c’) && ((choice=get_first())!=‘q’))中的第一个表达式就是false了,&&是短路运算符,所以不会再判断后面的,直接把整个表达式判定为false,所以就跳过了这个while,把字符a传回了main程序进了switch,得到了正确的反应

      1. 上面的big mistake改好后,程序正常多了,但是我发现输入c后由于需要再输入一个整数,于是整数输入结束后的换行符遗留在了输入流中,于是本次输入c得到正确响应后再输入不管什么选项,都会被提示Please respond with a, b, c or q.,这是因为换行符被返回去了,所以在get_integer程序末尾特地加了一个getchar()把换行符吸收掉·····
        ==注意输入a, b,c, q选项时换行符为什么没捣乱,那是因为get_first函数的末尾的while代码把输入选项时的第一个字符外的字符包括换行符都吸收掉了!!!!==哈哈哈哈哈哈哈
    while(getchar()!='\n')
            continue;
    

    上面的get_choice函数还可以这么写,简单点:
    注意choice变量生命为int才可以比较大小哦

    char get_choice()
    {
        int choice;
        printf("Enter the letter of your choice:\n");
        printf("a. advice       b. bell\nc. count        q. quit\n");
        choice=get_first();
        while((choice<'a' || choice>'c') && (choice!='q'))
            {
                printf("Please respond with a, b, c or q.\n");
                printf("Enter the letter of your choice:\n");
                printf("a. advice       b. bell\nc. count       q. quit\n");
                choice=get_first();
            }
        return choice;
    }
    

    总结

    在这里插入图片描述

    展开全文
  • 输入输出均在main函数中进行)。  界面如下: 请输入一个字符串:shanghai fudan<回车> 请输入一个字符:a<回车> 更新后的字符串为:shaanghaai fudaan...
  • 或者思维导图的方式把函数们列在一张A4纸上 不要死记 再去查什么 从主干抓起 自然就会了.|||什么学什么 主要的输入输出函数(文件和标准设备的都要) 而且函数这方面逐渐就会掌握的很熟了 这些学完了学好了...
    或者用思维导图的方式把函数们列在一张A4纸上 不要死记 再去查什么 
    从主干抓起 自然就会用了.
    
    
    |||
    用什么学什么 主要的输入输出函数(文件和标准设备的都要) 而且函数这方面逐渐就会掌握的很熟了 这些学完了学好了之后可以看看MFC类
    
    
    |||
    从基础做起 字符函数与字符串函数 数学库里的函数 逐步完善 
    
    
    |||
    碰到什么  用熟了才去用 MFC 根据函数的用途来记会比较好点 先编 WIN32(非MFC)程序 动态内存管理函数 这样会变得更容易懂  从前往后慢慢学习不但可以了解很多细节  那么多  
    
    
    |||
    自己动手搞个帮助文档不就行了 你要全会不可能
    
    
     编的时候忘了就查A4纸 强记很难记牢的
    
    
    |||
    不是有c语言的教程书吗 
    展开全文
  • 定义一个类࿰c;在其私有成员变量中保存从键盘输入的10个int类型值࿰c;然后按与输入的相反顺序输出它们。 </p>
  • //奇怪,c的值经过这次对d输入之后改变了 printf("c=%d\n",c); //c变成了NUL 空? 为什么呢? printf("d=%c\n",d); printf("%d\n",getchar()); //输出确认d的时候按的回车 printf("d=%c\n",d); //d...
  • c&c++函数变参的实现

    2016-06-11 20:50:29
    我们一般写的函数都是参数个数固定的,有时候起来不是很方便。 我们应该都过printf()函数,他的原型如下: int printf ( const char * format, ... ); printf是c语言中用来输出信息的,和c++中的cout...
  • 在main函数中,输入两个复数,判断两个复数是否相等(实部和虚部要分别相等),然后两者相加之和赋值给一个新的复数,并输出 思考:基于上面的Complex类,有如下main函数能否通过运行,有那些是错误的,为什么? int...
  • 1,首先注意的是在建立simulink模型的时候,需要建立输入输出,没有输入输出的话,则生成的代码函数为空,举例如下: 2,生成的代码 这里需要注意的是参数和返回值为空,但是要这个函数,我们必须修改这个函数,...
  • C中,当我们无法列出传递函数的所有实参的类型和数目时,可以省略号指定参数表。如 void func (...) 另外C语言提供了一套标准的处理方法。 先来看看下面的例子。(该函数实现的是:将不定长度的字符输出) #...
  • 在main函数中,输入两个复数,判断两个复数是否相等(实部和虚部要分别相等),然后两者相加之和赋值给一个新的复数,并输出 ``` #include using namespace std; /* run this program using the console ...
  • 1.使用随机函数模拟生成该班每个学生的考试 成绩,分数在[50,100]之间,并输出所有人的比 绩(每行输出10个分数)。 ⒉.计算所有学生的平均分,结果取2位小数。 3.输入你的序号,查询出你的成绩。 4.找出不及格...
  • N个学生的成绩整数scanf 输入c;输入的成绩在[0࿰c;100]之间。排序完成后࿰c;输入一个成绩࿰c;要求逐个比较查找的方式找出该成绩是该组中第几个元素的值(即第几名)。如果该成绩...
  • 一个简单的scanf输入流的细节问题和printf的本质对于任何一个接触过c的人,都会知道这个函数怎么用。可是不一定知道它本质是一个输入流。举个例子:scanf("%d%c%d",&x, &ch, &y);在运行输入时候,必须和scanf格式...
  • 但是不知道怎么用列表形式输出c;求教大佬 【def fbnq(x): if x==1 or x==2: return 1 else: return fbnq(x-1)+fbnq(x-2) n=int(input("请任意输入一个正整数n:"))...
  • c语言的字符串库函数,在string.h头文件中 ...如果strcpy这个拷贝函数,就要小心自己的输入参数是不是一个字符串,如果是字符数组,一定不要忘记结尾处赋值\0,不然的话就会溢出了,可以手动试...
  • 不知道怎么编写函数 <p>#include<stdio.h> int fun(int n) //n代表第几项。特别指出:0是第0项࿰c;不是第1项。 {<!-- -->  if (n <= 1)  return n; ...
  • 但是在自定义的函数不知道怎么去数组中的字符串按大小排序</strong></p> 题目要求: vector创建字符串数组对象࿰c;长度为5(30分)。  (1)手动输入以下5个英文句子,存入...
  • cout 请输入范围限定值c:" ; cin >> k; if (!cin >> k) { cout 输入无效,请输入正确的数据!" ; continue; } for (int i = 1; i ; ++i) { int j = 2; for (; j (i); ++j) { if (i%j == 0)/...
  • 题目是这样子的: 硬盘中存有两个数据文件,data1.txt 和 data2.txt。 文件数据格式如下: item1:value1 item2:value2 item3:value3...... ...总是显示出错 atoi到底怎么用啊 求大神帮助 感激不尽
  • 本人曾cstring里的strcat函数实现,希望有更优方案。 附上代码(无关部分已隐藏,不影响): ``` #include #include #include using namespace std; int main() { cout 输入一个不超过100的数:" ; ...
  • 谈谈函数式编程

    2020-12-31 02:38:23
    在任何时候对函数输入相同的参数时࿰c;总能输出相同的结果 <pre><code> javascript // 非纯函数函数内依赖函数外的变量值) var title = "Functional Programming"; var say = ...
  • 题目是:定义Student类和Score类,输出一个学生的成绩单(包括学号、姓名、高数、英语、政治、C++成绩)要求使用Student成员函数作为友元函数 我是这样写的(的是VS2013): **Student.h** ``` #pragma ...
  • 请编写一个fun函数c;实现如下功能:将一个字符串中第一个连续数字转换成整数...程序的输入输出要有提示) 比如:字符串中的内容为:"abc123 def45gh"࿰c;则函数的返回值为123。</p>
  • 比如我们要读取一个桌面路径下的文件 设计 一个函数 怎么写才能正确?...# 1 定义一个函数func(filename) filename:为文件名,with实现打开文件,并且输出文件内容。 def func(filename): with ope
  •  IntelliSense: 在没有适当 operator() 的情况下调类类型的对象或将函数转换到指向函数的类型 ) <code>#include "student.h" int main() { //对象初始化 Student stu0("无",0,0,0); ...
  • void input(headnode*l)//输入函数 { int i; elemtype a; printf("请输入在线性表中插入的位置和元素:"); scanf("%d%c",&i,&a); listinsert(&l,i,a); } void listinsert(headnode **l,int i,...
  • ├── 输入输出运算符重载.cpp ├── 输入输出重载.cpp ├── 输出格式.cpp 3.C++2.0 新特性 3.0 概况 C++2.0 是一个简称,意为「现代 C++」,包括 C++11/14/17/20。 3.1 C++11 新特性 Variadic Templates...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 250
精华内容 100
关键字:

c输入输出函数怎么用