代码格式化
同学们的码风可能一时半会不好培养,这种情况下不如尝试使用IDE自带的格式化功能:
拿DEV-C++举例:使用快捷键 ctrl + shift + A
可以快速方便的格式化代码。
格式化前:
格式化后:
(请忽视奇怪的配色)
基本输入输出
输入
scanf的小技巧
如果我们想一次性读取n位字符,那我们可以使用形如 %1d
的格式控制符( %nd
即每次只读入
n
n
n 个数字,
n
n
n 必须是个常数)
这一点偶尔会用到,比如输入日期
19710101
19710101
19710101 ,可以用 scanf("%4d%2d%2d",&year,&month,&day);
来读取
//示例程序
#include <stdio.h>
int main()
{
int a;
scanf("%2d", &a);
printf("%d\n", a);
return 0;
}
使用 %s
输入字符串时,在读到空白符时会停止读取(回车,空格等)
那么如果我们想一次读取一行包含空格的字符串,我们可以使用 gets()
函数
注意事项
当摁下回车的时候会同时产生一个回车符(在oj平台上是 \r\n
)
如果紧接着使用 getchar()
或 scanf("%c",&a)
获取字符,那么将会读取到回车符,导致无法读取我们预计的内容。这里就需要介绍一下
s
c
a
n
f
scanf
scanf 函数的特性:
1.空白字符会使 s c a n f scanf scanf 函数在读取过程中忽略缓冲区中的一个或多个空白字符
2.一个非空白字符会使 scanf()
函数在读入时剔除掉与这个非空白字符相同的字符
于是在这里介绍一种简单的解决忽略空白符,直接读取到我们想要的数据的办法
解决办法:
//示例程序
#include <stdio.h>
int main()
{
char a;
int n;
scanf("%d", &n);
scanf(" %c", &a); //scanf中都接先导空格,这样会过滤掉可见字符前的所有空白符
printf("%d %c\n", n, a);
return 0;
}
关于字符串读入
C语言中我们将字符串视为由字符构成的数组。读入字符串使用 %s
格式符。
//示例程序
#include <stdio.h>
int main()
{
char str[100]; //str是一个至多能存储99个字符的字符串
scanf("%s", str); //读取字符串
printf("%s\n", str);//输出字符串
return 0;
}
在读入字符串时,
s
c
a
n
f
scanf
scanf 里不要对字符数组取地址,即如果有 str[100]
,请直接写 scanf("%s", str);
而不是 scanf("%s", &str);
注意不要将读入字符串和读入单个字符搞混了,除了读入字符串外都要写 &
!
C语言的 string.h
库中有许多关于字符串操作的实用函数,同学们可以自行学习,逐渐掌握。
输出
printf格式控制符的操作
形如 %3d
将右对齐三位输出数字,左补空格。注意!如果你想要输出的数字多于三位,那么效果等同 %d
(即如果写 printf("%2d",12345);
将会输出 12345
而非 12
)
形如 %-3d
将左对齐输出三位数字,右补空格
形如 %03d
将右对齐输出三位数字,左补零
注:如果你写 %-03d
,那么你的0将会被无视掉,效果等同 %-3d
形如 %+d
将输出符号位,正数会在左侧输出 +
,负数在左侧输出 -
“+”、"-"也会被算作输出中的一位
//示例代码
#include <stdio.h>
int main()
{
int n = 12;
int m = 123456;
printf("%4d%4d\n%04d%04d\n%-4d%-4d\n%+d %+d", n, m, n, m, n, m, n, -n);
return 0;
}
如果输出的位数是不定的,我们可以使用 %*d
, %0*d
。
//示例代码
#include <stdio.h>
int main()
{
int n = 12;
int m = 123456;
printf("%*d %0*d\n", n, m, n, m); //n的作用就是控制输出几位数字,会被当做参数传入*中
return 0;
}
标识变量的使用
我们在写代码时,有时需要判断程序在运行过程中是否满足了某些条件,这时候我们可以使用一个标识变量来代表条件是否满足。拿判断三角形举例:
#include <stdio.h>
int main(){
int a;
int b;
int c;
scanf("%d%d%d", &a, &b, &c);
if(a > b){
int t = a;
a = b;
b = t;
}
if(a > c){
int t = a;
a = c;
c = t;
}
if(b > c){
int t = b;
b = c;
c = t;
}
int flag = 1; //默认为1,代表能构成三角形
if(a + b < = c){
printf("no triangle\n"); //不能构成三角形
flag = 0; //标识变量为0,代表不能构成三角形
}
else if(c * c < a * a + b * b){
printf("acute triangle\n"); //锐角三角形
}
else if(c * c == a * a + b * b){
printf("right triangle\n"); //直角三角形
}
else if(c * c > a * a + b * b){
printf("obtuse triangle\n"); //钝角三角形
}
if(flag){ //如果能够成三角形,则判断是否构成等腰三角形
if(a == b && a == c && b == c){
printf("equilateral triangle\n");
}
else if(a == b || a == c || b == c){
printf("isosceles triangle\n");
}
}
return 0;
}
本题不使用标识变量也能做出,这里只是举一个例子。使用标识变量是一种思想,使用范围很广,作用很大,同学们可以逐步理解这种思想。