1,printf与scanf都是c语言中常用的函数,printf用于格式化输出数据到标准输出设备(通常是终端或命令行窗口)。也就是俗称的打印。
2,scanf用于从标准输入设备(通常是终端或命令行窗口)读取格式化数据。也就是输入数据。
3,很多初学者都只会用printf进行打印输出,用scanf用于读取数据,而不知道其实它们是有返回值的,只不过用的不是很多,但是却有时候很好用,这里来详细介绍一下。
(红色的比较常用)
%d:用于输出或输入带符号的十进制整数。
%u:用于输出或输入无符号的十进制整数。
%f:用于输出或输入带小数的浮点数。
%lf:用于double类型
%c:用于输出或输入单个字符。
%s:用于输出或输入字符串(字符数组)。
%p:用于输出或输入内存地址。
%x:用于输出或输入十六进制整数。
%e:用科学计数法输出浮点数。
%o:以八进制形式输出整数。
%b:以二进制形式输出整数(部分编译器可能不支持)。
%%:输出一个百分号。
输出一个%比较特殊,特殊记
1,功能:用于格式化输出数据到标准输出设备(通常是终端或命令行窗口)。
2,头文件:#include<stdio.h>
声明:int printf(const char *format, …);
3,参数:format为控制输出格式的字符串,后面的可变参数根据格式字符串中的占位符进行替换。
4,返回值:成功输出字符数,若发生错误则返回负值。(换行符也算一个字符)
int main(void) {
int m = 0, n = 0;
float j = 0.1;
int res1 = printf("%d %d\n", m); // 第一个格式化字符串有两个占位符,但只提供了一个参数m
int res2 = printf("%d\n", j); // 将浮点数j以%d格式输出,会导致未定义的行为
int res3 = printf("%d\n", n); // 输出整数n的值为0
printf("%d %d %d", res1, res2, res3); // 输出res1、res2和res3的值
return 0;
}
1,int res1 = printf(“%d %d\n”, m);
这里的格式化字符串"%d %d\n"包含了两个占位符,但是只提供了一个参数m。
因此,该printf语句会产生一个未定义的行为,可能会输出无效数据。
在某些编译器上,可能会将未提供的第二个参数视为随机值,或者根本不输出任何内容。结果无法确定。
———————————————————————————
2,int res2 = printf(“%d\n”, j);
格式化字符串"%d\n"要求输出整数,但参数j是一个浮点数。
这种不匹配的格式化会导致未定义的行为。
在某些编译器上,可能会输出一个随机的整数值,或者输出完全无效的结果。结果无法确定。
———————————————————————————
3,int res3 = printf(“%d\n”, n);
格式化字符串"%d\n"正确地匹配了一个整数占位符,并且提供了整数变量n。
由于初始化时m和n都被赋值为0,所以这里会输出整数0。
———————————————————————————
4,printf(“%d %d %d”, res1, res2, res3);
这里打印了res1、res2和res3的值,它们分别是之前三个printf语句的返回值。
由于res1和res2的值是未定义的,所以输出结果也是不确定的。
1,功能:从标准输入设备(通常是终端或命令行窗口)读取格式化数据。
2,头文件同上
声明:int scanf(const char *format, …);
3,参数:format为控制输入格式的字符串,后面的可变参数地址用于存储读取的数据。
4,返回值:成功读取的输入项数,若发生错误或到达文件末尾则返回EOF。
1,格式字符串与要读取的参数类型不匹配:如果格式字符串中的占位符与要读取的参数类型不匹配,将导致未定义的行为或读取错误的数据。
int num;
scanf("%s", num); // 错误:尝试将字符串读取到整型变量num中
———————————————————————————
2,空指针作为参数:如果提供给scanf的参数是空指针(NULL),则会导致未定义的行为或崩溃。
char *str = NULL;
scanf("%s", str); // 错误:尝试将输入字符串保存到空指针str中
———————————————————————————
3,输入数据类型与期望的不匹配:如果要读取的数据类型与实际输入的数据类型不匹配,会导致读取错误的数据或未定义的行为。
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d\n", num);
// 用户输入了非数字字符,如字母或特殊符号
// 这将导致scanf无法正确读取整数值,并且num的值将保持不变
———————————————————————————
4,输入缓冲区溢出:如果要读取的数据超过了输入缓冲区的大小,会导致未定义的行为或崩溃。
char str[5];
scanf("%s", str); // 如果输入的字符串长度超过了4个字符(包括终止符),会导致缓冲区溢出
在C语言中,字段宽度指示器用于控制输出的字段的宽度。它被用于格式化输出函数(如printf)的格式字符串中,用于规定输出的字段所占的字符数。
字段宽度指示器由一个数字表示,并放置在%字符和转换说明符之间。例如,"%5d"表示希望将整数以字段宽度为5的形式输出。
当输出的数据不足字段宽度时,C语言会使用空格字符进行填充,使字段达到指定的宽度。如果输出的数据超过字段宽度,则会按照实际数据的长度进行输出,而忽略字段宽度指示器。
int number = 123;
printf("%5d\n", number);
输出:
123
在这个例子中,字段宽度指示器为5,所以输出的字段宽度为5。由于实际数据只有3个字符,因此在前面添加了两个空格字符,使得输出的字段达到了指定的宽度。
float value = 3.14159;
printf("%8.2f\n", value);
输出:
3.14
在这个例子中,字段宽度指示器为8,且精度为2(小数点后保留两位)。由于实际数据的长度为5个字符,所以在前面添加了3个空格字符,使得输出的字段达到了指定的宽度。
在scanf函数中,字符宽度指示器用于限制输入字段的最大宽度。它可以确保读取的字符串或数字不超过指定的字符数。
字符宽度指示器由一个数字放置在%字符后面,并在转换说明符之前。例如,"%5s"表示希望从输入中读取一个最大宽度为5的字符串。
下面是一些常用的字符宽度指示器的示例:
char string[10];
scanf("%9s", string);
在这个例子中,字符宽度指示器为9,所以scanf函数最多会读取9个字符(包括空字符’\0’),并将其存储到string数组中。这样做可以确保输入的字符串不会溢出数组的边界。
int number;
scanf("%3d", &number);
在这个例子中,字符宽度指示器为3,所以scanf函数只会读取最多3位数字,并将其存储到number变量中。如果输入的数字超过了3位,则只会读取前3位。
需要注意的是,字符宽度指示器只适用于字符串和整数类型的读取,对于浮点数类型的读取无效。对于浮点数类型,可以使用精度指示器来控制小数部分的位数。
在C语言中,精度指示器用于控制浮点数输出的小数位数。它可以确保输出的浮点数具有指定的精度。
精度指示器由一个句点(.)后面跟着一个数字表示,放置在转换说明符之前。例如,"%.2f"表示希望将浮点数以保留两位小数的形式输出。
下面是一些常用的精度指示器的示例:
float value = 3.14159;
printf("%.2f\n", value);
输出:
3.14
在这个例子中,精度指示器为2,所以输出的浮点数只包含两位小数。
double number = 123.456789;
printf("%.4lf\n", number);
输出:
123.4568
在这个例子中,精度指示器为4,所以输出的浮点数保留四位小数。注意,使用了"%lf"作为转换说明符来匹配double类型。
需要注意的是,精度指示器只适用于浮点数类型的输出,对于整数类型无效。