前导程序
//talkback.c --- 演示与用户交互
#include <stdio.h>
#include <string.h> //提供strlen()函数的原型
#define DENSITY 62.4 //人体密度(单位:磅/立方英尺)
int main(void)
{
//定义重量和体积两个变量
float weight = 0, volume = 0;
//定义size代表对象的大小(单位是字节),letters代表字符个数
int size = 0, letters = 0;
//定义一个可容纳40个字符的数组
char name[40] = { 0 };
//提示用户输入名字
printf("你的名字是?(baby)\n");
scanf("%s", name);
//提示用户输入体重
printf("你的体重是?(110)\n");
scanf("%f", &weight);
size = sizeof(name);
letters = strlen(name);
volume = weight / DENSITY;
//输出结果
printf("%s, your volume is %.2f cubic feet.\n", name, volume);
printf("你的名字有%d个字符\n", letters);
printf("我们有%d个字节来存储它\n", size);
return 0;
}
运行结果如下:
字符串简介
前导程序中的 printf("你的名字是?(baby)\n") 为例,其中双引号表示它括起来的是字符串,但是双引号本身不是字符串的一部分。单引号用于标识单个字符,例如 'a' 。
使用字符串
根据%s转换说明,scanf()在遇到第一个空白(空格、制表符和换行符)时就不再读取输入,也就是说此时它只读取一个单词,而不是一整个句子。
明示常量
limits.h和float.h中的一些明示常量
printf()和scanf()
prinft()函数
printf()的转换说明
其中没有float类型的转换说明,因为float类型传递给函数时会自动转换成double类型
printf()的转换说明修饰符
printf()中的标记
演示下%f、%g和%#g
//printf_01.c --- 演示%f、%g和%#g
#include <stdio.h>
int main(void)
{
float a = 1.5;
printf("使用%%f输出a的结果是:%f\n", a);
printf("使用%%g输出a的结果是:%g\n", a);
printf("使用%%#g输出a的结果是:%#g\n", a);
return 0;
}
运行结果如下:
演示下%.0f和%#.0f
//printf_02.c --- 演示%.0f和%#.0f
#include <stdio.h>
int main(void)
{
float a = 1.5;
printf("使用%%.0f输出a的结果是:%.0f\n", a);
printf("使用%%#.0f输出a的结果是:%#.0f\n", a);
return 0;
}
运行结果如下:
转换说明的意义
转换说明把以二进制格式存储在计算机中的值转换成一系列字符(字符串)以便于显示。例如,数字76在计算机内部的存储格式是二进制数01001100。%d转换说明将其转换成字符7和6,并显示为76。
转换不会将原始值替换为转换后的值。实际上,转换说明只是翻译说明。
转换不匹配
不要忽视参数传递中的内容
printf()的返回值
返回值是函数计算后返回给主调程序(calling program)的值。
printf()函数一般返回打印字符的个数(包括空格和不可见的换行符 '\n' );如果有输出错误,printf()则返回一个负值。
打印较长的字符串
printf()语句可以换行书写不同部分,编译器会忽略其中的空白部分。但是,不能在双引号括起来的字符串中间断行。例如:
printf("anne中有%d个字符",
number);
字符串断行的三种方法:
1.使用多个printf()语句,只在最后一个语句中使用换行符号。
2.用反斜杠 ' \ '和enter键组合来断行。此时下一行代码必须从最左边开始。如果缩进该行,比如缩进5个空格,那么这5个空格就会成为字符串的一部分。
3.使用多个双引号分割字符串,中间可以用空白隔开。
使用scanf()
scanf()函数所用的转换说明与printf()函数几乎相同。主要区别在float类型和double类型
上面scanf()的转换修饰符的截图是第五版的,和第六版有点区别但不大,没找到第六版的资料,哈哈哈
格式字符串中的普通字符
scanf()函数允许把普通字符放在格式字符串中。处空格字符外的普通字符必须与输入字符串严格匹配。例如,假设在两个转换说明中添加一个逗号:
scanf("%d,%d", &n, &m);
此时用户输入两个数时也必须加上逗号,由于scanf()会跳过数字前面的空白,所以下面三种输入都可以(逗号前面都没有空格。而且由于上面scanf中的逗号是半角格式的英文逗号,所以用户输入的逗号也必须是半角格式的英文逗号,不能是全角格式的中文逗号)(注意:当转换说明是%c时,不会自动跳过输入值前面的空白):
1.数字,数字
2.数字,空格加上数字
3.空格加上数字,空格加上数字
scanf()函数格式字符串中的空白意味着跳过下一个输入项前面的所有空白(所有空白的概念包括没有空格的特殊情况)。例如,对于下面的语句:
scanf("%d加空格,%d", &n, &m);
以下的输入格式都没问题:
数字,数字
空格加数字,数字
数字,空格加数字
空格数字,空格加数字
数字加空格,数字
空格数字加空格,数字
数字加空格,空格加数字
空格加数字加空格,空格加数字
scanf()的返回值
scanf()函数返回成功读取的项数。当输入不匹配时,返回0。当遇到文件结尾时,返回EOF。
printf()和scanf()的*修饰符号
printf()函数中可以用*修饰符代替字段宽度,但还是要用一个参数告诉函数字段宽度应该是多少。
下面的程序演示了相关用法:
//seconds_varwid.c --- 使用变宽输出字段
#include <stdio.h>
int main(void)
{
//定义width表示字段宽度,定义precision表示精确度
unsigned width = 0, precision = 0;
int number = 256;
double weight = 242.5;
printf("请输入一个字段宽度:(6)\n");
scanf("%u", &width);
printf("number的值为:%0*d\n", width, number);
printf("请输入一个字段宽度:(8)\n");
scanf("%u", &width);
printf("请输入一个精确度:(3)\n");
scanf("%u", &precision);
printf("Weight = %0*.*f\n", width, precision, weight);
return 0;
}
运行结果如下:
scanf()函数中把*放在%和转换说明字符之间时,会使得scanf()函数跳过相应的输入项。
示例程序如下:
//third_skiptwo.c --- 跳过输入中的前两个整数
#include <stdio.h>
int main(void)
{
int n = 0;
printf("please enter three integers:(2013 2014 2015)\n");
scanf("%*d %*d %d", &n);
printf("the last integer was %d\n", n);
return 0;
}
运行结果如下:
printf()的用法提示
其中的本地化设置暂时用不到,以后有时间研究后再补吧
注:
以上内容为本人学习时的一些笔记,有问题可以私信或留言一起交流,想要电子资料的私信留下联系方式并说明来意