已知半径求周长面积代码
#include <stdio.h>
//#define Pi 3.1415926//不建议使用,机械替换,容易出错
const float Pi=3.1415926;//建议使用,会检查变量类型,便于调试
int main(){
// float r;
// scanf("%f",&r);//float型变量的输入用的是%f
double r;
scanf("%lf",&r);//double型变量的输入用的是%lf
printf("%.2f\n",2*Pi*r);//.n对输出小数位数做限定
printf("%7.2f",Pi*r*r); //m.n,m对输出的数据以m位右对齐输出
}
问题:为什么用%lf读入双精度实数,而用%f输出呢?
限定n位输入%nd,如输入1234,则输出a=12,b=34
scanf("%2d%2d", &a, &b);
\",输出双引号
12 ↙34 ↙ 输出: “12”,“34”
printf(" \"%d\", \"%d\"\n", a, b);
- 这里,函数printf()格式控制字符串中的字符' \" '是转义字符,代表双引号字符。
- 格式转换说明 ( Format Specifier )由%开始并以转换字符( Conversion Character )结束,用于指定各输出值参数的输出格式。
- 使用转义字符的原因是,双引号在printf中加输出格式代表输出类型,要单独输出双引号
输入数据的格式控制:scanf何时认为输入结束?
如果用户输入了非法字符,例如输入了12 3a或者123a,那么程序运行结果如何?
- 此时,程序运行结果为:
- 这是因为当程序从输入数据中读取第2 个数据时遇到了非法输入字符 a,于是第 2 个被读入的数据就是3。而a会放在缓冲区中等待下一个scanf来存入内存,如果后面的scanf可以读入字符的话,如果不行,则一样是舍弃的
输出百分号
忽略输入修饰符
//scanf("%d%*c%d", &a, &b);//使用忽略输入修饰符来实现用户以任意字符作为分隔符进行数据的输入
#include <stdio.h>
int main(){
int a,b,c;
// char c;
scanf("%d%*d%d",&a,&b,&c);
printf("a=%db=%dc=%d\n", a,b,c);
}
%*表示忽略一次该类型的输入,本例中忽略了5。
%2d%*2d%2d 123456 输出a=12,b=56
从键盘输入a值b值,输出a值b值,设计程序要求使得用户可以以任意字符作为分隔符进行数据输入
用scanf()函数的%c 格式符输入字符型数据时要注意什么问题?
-
在用%c格式读入字符时,空格字符和转义字符(包括回车)都会被当作有效字符读入
-
解决这个问题:getchar、空格%c(忽略前面数据输入时存入缓冲区中的回车符)、%*c(忽略本格式输入一次)、scanf返回值
方法1:用函数 getchar()将数据输入时存入缓冲区中的回车符读入,以避免被后面的字符型变量作为有效字符读入。
方法 2:在%c 前面加一个空格,忽略前面数据输入时存入缓冲区中的回车符,避免被后面的字符型变量作为有效字符读入。与方法1 相比,方法 2更简单,程序可读性也更好。
方法3:用忽略输入修饰符
本例中输入a和b的值,使用了%*c后无论用户在ab中间输入什么字符都不会被读入。
#include <stdio.h>
int main(){
int a,b;
char op;
scanf("%d%*c%d",&a,&b);
printf("a=%d b=%d 和=%d\n", a,b,a+b);
}
方法4:可以通过判断scanf()的返回值来确定是否成功读入了指定的数据项数,返回指定数据项数则表示输入函数被成功调用,当返回EOF(EOF是宏名,在stdio.h中通常被定义为-1),表示函数调用失败,即未能读入制定的数据项数。
函数scanf()和 gets()有何不同?
能否输入带空格字符串 | 结束标志 | 可以读取类型 | |
scanf() | %s格式,不能读入带空格字符串。(一空格就结束了) %c格式可以输入空格,但是只能输入一位字符。 | 回车,空格,tab键结束输入,会自动添加'\0',且会留在缓冲区中 | 所有类型的变量 |
gets() | 可以读入带空格字符串,因为空格和制表符都是字符串的一部分。 | 回车结束输入,用'\n'替代 '\0',同时回车符会从缓冲区读走,但不作为字符串的一部分 | 只读字符串 |
函数printf()、scanf()中的格式转换说明符和格式修饰符有哪些?(不必记,用就查一查)