五.输入输出函数
1.输入scanf
(1)scanf函数双引号中不能出现\n否则需要多输入一次数据,且此数据无用。
(2)&符号不能省略。注意变量列表中,应该是变量的地址。变量的地址通过求地址符&得到。所以在写代码时千万要记住&符号。
(3)如果格式字符串中有非空白字符,也就是除了格式控制字符和空白字符之外的字符,则用户在输入的时候一定也要输入这些字符。否则将出现不匹配格式控制字符串的情况。为了使用户正确输入,编程时一定要考虑到用户是否清楚如何输入,最好在需要用户输入前提示如何输入的格式。
(4)在用%c格式符时,空格字符与转义字符都被当作有效字符输入:
char c1, c2, c3;
scanf("%c%c%c", &c1, &c2, &c3);
printf("[%c][%c][%c]\n", c1, c2, c3);
(5)以回车作为下达开始解析命令。整个输入以回车结束。如果输入的数据满足了scanf对需要,则输入结束,如果回车后数据不够,则回车只当作一个空白符。
(6)scanf解析数据,下列情况认为解析出来一个数据:读入非字符型数据时,遇到空白字符;有宽度指示时,读入到相应的宽度,如%3d只解析3个数字即认为读入这个整数完毕。
getchar字符输入
(7)输入数据不能指定精度,宽度和小数点后位数,加上后scanf函数无效。
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>//极限的头文件
#include<float.h>//浮点数极限值存放的头文件
#include<stdbool.h>//支持C语言的bool类型变量
#include<windows.h>
#include<locale.h>
#include<math.h>
/1scanf初始化整型数据/
void main1()
{
int num;
int a, b, c,d,e,f,g;
//scanf("%d", &num);//scanf通过地址,将键盘输入转换成数据进行赋值。
%d按照整数来解析,传入num的地址,就根据地址对num初始化赋值。
格式符和printf函数类似,格式字符串以%开始,以一个格式字符结束,中间可以插入附加的字符。
//printf("%d\n", num);
//scanf("%d%d%d", &a, &b, &c);//输入多个数据,可以用空格、TAB键、回车键分隔,最后一定要回车
//printf("a=%d,b=%d,c=%d\n", a, b, c);
//scanf("%d,%d,%d,%d,%d,%d", &a, &b, &c,&d,&e,&f);//输入多个数据,可以用逗号分隔,输入时需注意必须加入逗号符,且区分其中英文,最后一定要回车
//printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n", a, b, c,d,e,f);
//scanf(" %d%d %d ", &a, &b, &c);//空白符在%前会被忽略,在格式符之间也会被忽略,在%结束的末尾会要求多输入数据,但不影响结果。
使用scanf的时候,尽量不要使用空白符与非空白符。
//printf("a=%d,b=%d,c=%d\n", a, b, c);
//char c1, c2, c3;
//scanf("%c%c%c", &c1, &c2, &c3);
//printf("[%c][%c][%c]\n", c1, c2, c3);
scanf("%3d", &num);
printf("%d\n", num);
system("pause");
}
/2scanf初始化浮点型数据/
void main2()
{
double db=1.0;
scanf("%f", &db);//取地址进行初始化,%f没有生效
printf("db=%f", db);
scanf("%lf", &db);//双精度实数需要小写字母l,输入需是实数
printf("db=%f", db);
scanf("%le", &db);
printf("db=%f", db);
scanf("%lE", &db);
printf("db=%f", db);
scanf("%lg", &db);
printf("db=%f", db);
scanf("%lG", &db);
printf("db=%f", db);
scanf("%LG", &db);//L大小写都可以。
printf("db=%Lf", db);
system("pause");
}
/3getchar和gets/
void main3()
{
char c = getchar();
putchar(c);
putchar('\n');
char str[50];
gets(str);
system(str);
system("pause");
}
/4scanf扫描集合/
void main4()
{
char str[30] = { 0 };//定义字符串,全部初始化为字符‘\0’
//scanf("%s", str);
//printf("%s\n", str);
//scanf("%[xyz]", str);//只接受xyz的输入,有一个不匹配就停止,即使后面还有xyz
//printf("%s\n", str);
//scanf("%[^xyz]", str);//接受xyz以外的字符
//printf("%s\n", str);
scanf("%[A-Z]", str);//接受A-Z的字符
printf("%s\n", str);
system("pause");
}
/5字符大小写转换/
void main5()
{
char ch = getchar();
(ch >= 'A'&&ch <= 'Z') ? ch = ch + 32 : ch;//大写转小写
printf("%c\n", ch);
(ch >= 'A'&&ch <= 'Z') ? ch = ch + 32 : ((ch >= 'a'&&ch <= 'z') ? ch -= 32 : ch);//大写转小写,小写转大写
printf("%c\n", ch);
system("pause");
}
/6统计输入输出字符数量百分号/
void main6()
{
int num,data;
scanf("%d%n", &data, &num);
printf("%d,%d\n", data, num);
//printf("hello%n china\n", &num);
VS2013已经在printf中禁用了%n
//printf("num=%d\n", num);
system("pause");
}
/7百分号i输入输出/
void main7()
{
int num;
scanf("%i", &num);
printf("%i\n", num);
//%i与%d等价
system("pause");
}
/8十六进制指数方式输出实数/
void main()
{
float fl=2345.0;
printf("%f\n", fl);
scanf("%*f", fl);//%后面的*格式符用来表示在解析时将读入的数据忽略不赋值给任何变量
printf("%a,%A\n", fl, fl);//十六进制指数形式输出
system("pause");
}
C++中为cin
2.输出printf
printf(格式控制,输出表)
格式控制:用双引号括起来的格式控制转换字符串
输出表:输出表中的数据可以是合法的常量、变量和表达式,要与格式控制中的格式字符一一对应。
printf(“结果是:%d\n”,10);//由%后跟格式字符组成,将输出数据转换为指定格式输出;“结果是”字符串原样输出;“\n”转义字符,输出换行。
使用printf时一定要类型匹配。
同样的二进制数据,按照不同的解析方式就有不同的结果;不同的类型,解析方式不同。
printf第一个类型不匹配,转换失败,会造成第二个也失败,即使第二个也匹配。
/1整数输出格式/
void main1()
{
int num = 123456;//正负数一致
printf("%d\n", num);
printf("%10d\n", num); //整数10指定打印数的宽度,大于实际数据的宽度则左端补空格。
printf("%3d\n", num);//如果指定的数据宽度小于实际数据宽度则正常输出
printf("\n%010d\n", num); //整数10指定打印数的宽度,0指大于实际数据的宽度时左端补0。
printf("%03d\n", num);
printf("\n%-10d\n", num);//-指数据左对齐。
printf("%-3d\n", num);
printf("\n%d\n", num);//32位操作系统中的整型和长整型是一样的,嵌入式系统会有所不同。
printf("%ld\n", num);
system("pause");
}
/2/
void main2()
{
int x = -1;
unsigned int y = -1;//-1不在unsigned int类型范围内,它的范围是大于等于0,此时就会直接将-1的二进制赋值过来,因此和x的效果相同。
printf("%x\n", &x);
printf("%d\t%u\t%o\t%x\n", x, x, x, x);
//%d有符号位,所以解析为-1;
//%u,%o,%x分别代表无符号十进制,八进制,十六进制,按照无符号解析就全是数据没有符号。
//在输出的时候按照指定的形式输出,不管当初声明的时候的类型。
printf("%x\n", &y);
printf("%u\t%d\t%o\t%x\n", y, y, y, y);
system("pause");
}
/3不同进制下的输出格式/
void main3()
{
int num1 = 10;
int num2 = 010;
int num3 = 0x10;
printf("%d\t%d\n", sizeof(int),sizeof(unsigned int));//4 4
printf("%d\t%d\n", sizeof(short), sizeof(unsigned short));//2 2
printf("%d\t%d\t%d\n", num1, num2, num3);
printf("%i\t%o\t%x\n", num1, num2, num3);
printf("%i\t%#o\t%#x\n", num1, num2, num3);
//%#o按照八进制输出带0
//%#x按照十六进制输出带0x
system("pause");
}
/4字符与字符串输出格式/
void main4()
{
char str[] = "hello world";
//字符
printf("%c%c%c%c%c %c%c%c%c%c\n", 'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd');
printf("%c%c%c%c%c %c%c%c%c%c\n", 104, 101, 108, 108, 111, 119, 111, 114, 108, 100);
printf("%c%c%c%c%c%c%c%c%c%c%c\n", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7], str[8], str[9], str[10]);
//字符串
printf("%15s\n", "hello world");//15为字符串宽度,宽度大于实际长度就补充空格
printf("%5s\n", "hello world");//5为输出限定宽度,小于实际宽度按照实际长度输出
printf("%-15s\n", "hello world");//-号表示字符串需要左对齐
printf("%15.5s\n", "hello world");//输出字符串前5个字符,总共占15列,右对齐,结果为 hello
printf("%15.3s\n", "hello world");//输出字符串前3个字符,总共占15列,右对齐,结果为 hel
printf("%s\n", str);
system("pause");
}
/5浮点数输出格式/
void main5()
{
float fl = 1.2345f;
double db = 5.43216789;
printf("%f,%f\n", fl, db);//%f精确到小数点后面六位
printf("%15f,%15f\n", fl, db);//15为限定宽度,宽度大于实际长度就在左边补充空格
printf("%5f,%5f\n", fl, db);//5为输出限定宽度,小于实际宽度按照实际长度输出
printf("%-15f,%-15f\n", fl, db);//-号表示左对齐
printf("%.10f,%.10f\n", fl, db);//.10表示小数点后保留10位
printf("%-15.10f,%-15.10f\n", fl, db);//左边对齐,数据总宽度15,小数点后保留10位
system("pause");
}
/6指数输出格式/
void main6()
{
printf("%e\n", 12.3);//1.230000e+001
//输出数据共占13位,其中整数占1位,小数点占1位,小数部分占6位,
//指数符号e占1位,指数占3位,如果输出为负值,还应增加一位整数部分的符号位。
float fl = 1.2345f;
double db = 5.43216789;
printf("%e,%e\n", fl, db);
double bigdata = 123456789101112131415.0;
double smalldata = 0.00000123456789101112131415;
printf("%15e,%15e\n", bigdata, smalldata);//15为限定宽度,宽度大于实际长度就在左边补充空格
printf("%5e,%5e\n", bigdata, smalldata);//5为输出限定宽度,小于实际宽度按照实际长度输出
printf("%-15e,%-15e\n", bigdata, smalldata);//-号表示左对齐
printf("%.10e,%.10e\n", bigdata, smalldata);//.10表示小数点后保留10位
printf("%-15.2e,%-15.2e\n", bigdata, smalldata);//左边对齐,数据总宽度15,小数点后保留2位
printf("%015e,%015e\n", bigdata, smalldata);//15为限定宽度,宽度大于实际长度就在左边补充0
printf("%05e,%05e\n", bigdata, smalldata);//5为输出限定宽度,小于实际宽度按照实际长度输出
system("pause");
}
/7g格式符/
void main()
{
float x = 12.345;
printf("%f,%e,%g\n", x, x, x);
//%g根据数值的大小,自动选择用f格式或e格式输出实数。
//输出时选择占宽度较小的一种,且不输出无意义的零。
system("pause");
}
putchar字符输出,需注意回车也是字符。
puts字符串输出
/11putchar和puts/
puts("hello world");//自动换行
putchar('h');
putchar('e');
putchar('l');
putchar('l');
putchar('o');
putchar(' ');
putchar('w');
putchar('o');
putchar('r');
putchar('l');
putchar('d');
putchar('\n');
putchar(110);
putchar('A' + 32);
3.sprintf()//格式化字符串输出
int sprintf(char *str, const char *format, ...);//发送格式化输出到 str 所指向的字符串。
C++中为cout