本文共 8108 字,大约阅读时间需要 27 分钟。
C 输入函数
和 C++ 输入函数
。在 CPP 代码中,这两类函数都可以使用,只要导入所在函数库即可;但是在 C 代码中,只能使用 C 输入函数
。#include#include #include "hello.h"int main(){ // 示例1:使用 scanf 函数和 printf ,请导入 stdio.h 文件 int num; // 声明一个整型变量 int t = scanf("%d", &num); // 第一个参数是格式控制符,后面展开,这里只需知道 %d 表示整数,& 用于取地址 printf("%d", num); // 示例二:getchar 和 putchar int num1; num1 = getchar(); putchar(num1); // 示例三:使用 gets 和 puts char str[20]; // 字符数组,后面详细展开 gets_s(str); puts(str);}
FILE* f = NULL;f = fopen("test.txt", "r");// 分别用fscanf、fgets 和 fgetc 读取文件内容char buff[1024];fscanf(f, "%s", buff);printf("%s\n", buff);fclose(f);f = fopen("test.txt", "a");fprintf(f, ",一些追加内容");fclose(f);f = fopen("test.txt", "r");fgets(buff, 50, f);printf("%s\n", buff);fclose(f);f = fopen("test.txt", "a");fputs(",Trying写入用fputs", f);fclose(f);f = fopen("test.txt", "r");fscanf(f, "%s", buff);printf("%s\n", buff);fclose(f);
格式化输入输出
。C 语言库函数中提供了一对格式化I/O函数,就是scanf 与 printf
。
首先,请记住以下格式控制符:
当然,C 语言的格式控制符不止这些,但是这些是最常用的,新手如果能从一开始就将这些常用的printf格式控制符记牢,那么后面的格式化输入输出将是小菜一碟。
光说不练是假把式,接下来用代码演示一遍。
在 hello.h 文件里创建一个函数:void formatIn(void)
,并在main函数中进行调用。
现在函数体里面编辑好如下内容:
int num1 = 1024;long num2 = 655356;int num3 = -15;int a = 65;float num4 = 123.456;char str[24] = "Hello world\0";long num5 = 1024578964155;
然后使用 %d
对 num1 和 num4 进行输出,代码如下:printf("num1=%d,num4=%d", num1, num4);
,其输出内容为:num1=1024,num4=536870912
,对num1正确输出,而对num4确输出了不一样的内容。这是因为使用了 %d 即整数格式控制符之后,系统会用整数的格式去解释参数,而num4不是整数格式,而是实数格式,而实数格式在计算机的实现方式与整数格式是不一样的,有兴趣的同学可以参考这篇博客:。
接着使用 %5d
对 num1 和 num2 进行输入,代码:printf("num1=%5d, num2=%5d\n", num1, num2);
,其输出内容num1= 1024, num2=655356
,对于num1,由于位数不够进行了空格填充,而num2的输出则没有。
再用%ld
对num2和num5进行输出:printf("num2=%d,num5=%ld\n", num2, num5);
,其结果如下:num2=655356,num5=-1918219589
,num2 正确输出,num5 则变成了负数。这是因为这个控制符是长整型控制符,而C语言长整型由于我的编辑器是32位而被默认为32位,而2^32=4,294,967,296,是一个以4为开头的十位十进制数,何况实际上32位中最高位是符号位,可以表示的范围就更小了。因此,后面的编程要注意数据表示范围,免得因为溢出导致想不到的后果。
接着,尝试用 %u
去输出一个负数,结果如何:printf("num3=%d,num3=%u\n", num3, num3);
,结果num3=-15,num3=4294967281
。看到这里,有没有感到神奇?一个负数用%u输出后变成了正数,而且还是一个很大的整数,这个原因和用%d去输出num4差不多,都是计算机采取不同策略读取相同数据产生的结果。具体可以看看我的《计算机组成原理》系列博客中关于数据表示的博客。
最后看看 %f与%lf
的区别,printf("num4=%f,num4=%.1f\n", num4, num4);
,num4=123.456001,num4=123.5
,可见%f是默认输出小数点后六位,而且当位数不够是后用一个后缀填充。
其他几个就不一一讲了,请看完整函数代码:
void formatIn(void){ int num1 = 1024; long num2 = 655356; int num3 = -15; int a = 65; float num4 = 123.456; long num5 = 1024578964155; char str[24] = "Hello world\0"; // 首先体验%d格式输出 printf("num1=%d,num4=%d\n", num1, num4); //%ld printf("num2=%d,num5=%ld\n", num2, num5); // %md printf("num1=%5d, num2=%5d\n", num1, num2); // %u printf("num3=%d,num3=%u\n", num3, num3); //%f %lf printf("num4=%f,num4=%.1f\n", num4, num4); // %c printf("a=%d, a=%c\n"); // %s printf("str=%s\n", str); //%o %x printf("num2=%o, num2=%x", num2, num2);}
全部输出:
接下来,看看格式化输入 scanf。对于scanf 的使用,要遵循一模一样
原则,接下来我会给出一个正确示例,由于篇幅,我便不再像格式输出那样尝试不同格式组合会有什么效果,有兴趣的朋友请自己动手尝试。
同样的,在 hello.h 中新建一个 void formatOut(void)
函数。
void formatOut(void){ int num1; float num2; double num3; char* str[100]; printf("请按照格式进行输入:\n"); scanf("%d,%f,%lf,%s", &num1, &num2, &num3, &str); printf("num1=%d,num2=%f,num3=%lf,str=%s", num1, num2, num3, str);}
输入如下:
逗号是英文逗号。
流输入与流输出
,其中最为常用的就是用“cout<< [data]<<endl;”
进行输出,用cin>>[variable];
进行输入。cout与cin和cerr与clog
两组 I/O 函数,分别是标准输入/输出流、非缓冲标准错误流和缓冲标准错误流。接下来进行代码示例。
首先是标准输入流与标准输出流,即 cout 和 cin 的使用。
因为我们之前使用 C++ 默认模板生成的工程项目,因此在启动文件中编辑器已经事先帮我们引入了 iostream 文件。
所以我们直接在 main 函数里面编辑如下代码示例:
// 如果在文件头部没有使用 using namespace std;// 则以下代码在使用 cout 或 cin 时请改为 std::cout 或 std::cinint t;cout << "请输入一个整数:";cin >> t;cout << "你所输入的整数为:" << t << endl; // endl 表示换行int num;char s[50];cout << "请输入一个整数和字符串:";cin >> num >> s;cout << "你所输入的整数:" << num << ",你所输入的字符串:" << s << endl;
其输出结果如下:
由这个例子便可以大致看出,使用 C++ 输入输出流,比 C 语言的标准输入输出函数方便的地方就在于,不同数据类型的数据可以在不用控制符的情况下就能一起输入与输出。
iostream 库文件除了提供上面的 cout 和 cin 外,还提供了以下方法:
由于 cerr 和 clog 平时用得不多,便不进行代码示例,接下来重点看看 iomanip 头文件为我们提供的函数及其作用。
setiosflags(ios::fixed) 固定的浮点显示 setiosflags(ios::scientific) 指数表示 setiosflags(ios::left) 左对齐 setiosflags(ios::right) 右对齐 setiosflags(ios::skipws 忽略前导空白 setiosflags(ios::uppercase) 16进制数大写输出 setiosflags(ios::lowercase) 16进制小写输出 setiosflags(ios::showpoint) 强制显示小数点 setiosflags(ios::showpos) 强制显示符号
// 使用之前先导入 iomanip 库文件 cout << setiosflags(ios::left | ios::showpoint); // 设左对齐,以一般实数方式显示 cout.precision(5); // 设置除小数点外有五位有效数字 cout << 123.456789 << endl; cout.width(10); // 设置显示域宽10 cout.fill('*'); // 在显示区域空白处用*填充 cout << resetiosflags(ios::left); // 清除状态左对齐 cout << setiosflags(ios::right); // 设置右对齐 cout << 123.456789 << endl; cout << setiosflags(ios::left | ios::fixed); // 设左对齐,以固定小数位显示 cout.precision(3); // 设置实数显示三位小数 cout << 999.123456 << endl; cout << resetiosflags(ios::left | ios::fixed); //清除状态左对齐和定点格式 cout << setiosflags(ios::left | ios::scientific); //设置左对齐,以科学技术法显示 cout.precision(3); //设置保留三位小数 cout << 123.45678 << endl;
转载地址:http://ihqgn.baihongyu.com/