快速上手
空白和注释
为什么需要注释?
清晰的程序结构固然重要,但是告诉读者程序能做什么以及怎么做更为重要。,如今软件最大的开销不是编写,而是维护,注释就是实现这个功能。
注释怎么用?
注释以符号 /* 开始,以符号 / 结束。在c语言中,凡是可以插入空白的地方都可以使用注释。但是注释不能嵌套,第一个 / 和第一个 */ 号之间的内容被看作注释。也就是说代码一旦嵌套,比如:
/*
xxxxxxx
/*
zzzzzz
*/
yyyyyyy
*/
上面的有效注释只有第一个 /* 和第一个 */ 之间,也就是说从 yyyyyyy 开始后面的内容将不再是注释内容,所以最好不要用这种注释来注释代码,除非你的代码连一个用 / * */ 的注释都没有。(不写注释是个坏习惯)
如何注释代码?
从逻辑上删除一段代码(代码不删除,而是注释掉),使用 #if 指令注释代码。
使用方法:
#if 0
statements
#endif
在 #if 和 #endif 之间的程序段就可以有效地从程序中去除,即时代码之间存在注释。
预处理指令
#include<stido.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COLS 20
#define MAX_INPUT 1000
上面是预处理指令?
上面五个都是预处理指令,因为他们都是由预处理器解释的。预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。
预处理指令#define
#define 定义一个常量。定义的名字(名字一般大写,便于和普通变量区分)出现时,自动替换成定义的数值,因为他是常量,所以不能出现在 = (赋值符号)的左边。
函数原型
什么是函数原型?
void read_column_numbers(int columns[ ],int max);
上面声明了一个函数,这些声明就叫做函数原型。他告诉编译器这些以后将在源文件中定义的函数的特征。
main 函数
什么是main函数
每个c程序必须有一个main函数,他是程序执行的起点。
int main(void){…}
上面时一种比较标准的写法,int 表示函数返回一个整型值,void 表示函数不接受任何参数。
gets 函数
什么是 gets 函数?
gets 函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符结尾。gets 函数丢弃换行符并在该行的末尾存储一个NUL字节。然后gets 函数返回一个非 NULL 的值表示成功读取。当gets 函数被调用然而不存在输入行世,他就返回 NULL 值,表示它到达了输入的末尾。
C语言中,存在一项约定:字符串是一串以 NUL 字节结尾的字符。NUL 是作为字符串的终止符,它本身并不被看作字符串的一部分
NUL 和 NULL
1.NUL 是ASCII 字符集中 ‘\0’ 的字符的名字,他的字节模式全为0。
NULL 指一个其值为0的指针。
2.两者都是整型值,都是常量,值也相同,所以他们可以交换使用。但是重点是,我们应该在对应的场合使用合适的常量,他告诉阅读程序的人这不仅是个零值,还有他的表示意义。
就好像中文的”零“和数字“0”,人们都会写
1 - 1 = 0
而不是写
1 - 1 = 零
3.符号NULL在头文件 stdio.h 中定义。并不存在预定于符号NUL,如果你想使用它而不是字符常量 ‘\0’,
你必须自行定义。
gets 函数和 scanf 函数的区别
scanf()在接受字符串的时候,遇见字符串结束符号 也就是空白符,不吸收并且将之留在输入缓存缓存区内(stdin文件中),使得下一个字符在吸收时先遇见的便是空白符。可以用getchar()把该空白符吸收了,防止对后面的字符吸收数据有影响。
char a,s[100];
scanf("%s",s);
getchar();//用来吸收空格
scanf("%c",&a);
printf("string s=*%s*,char a=*%c*",s,a);
输出结果:abcd e
string s=*abcd*,char a=*e*
注意看a的值,有上面的a是e下面的是一个空格,说明使用scanf输入时,键盘的缓冲区中留下了一个字符,而这个字符可能会影响后面的数据。
char a,s[100];
scanf("%s",s);
//getchar();
scanf("%c",&a);//读取到了上一个scanf读取留在缓存区的终止符,遇到终止符结束,并把该符号给a
printf("string s=*%s*,char a=*%c*",s,a);
输出结果:abcd e
string s=*abcd*,char a=* *
gets()在吸收字符串时遇见回车就把回车从输入缓存区内吸收,并且结束吸收,把吸收的回车符号变为字符串结束标志’\0’
所以gets()吸收字符串时不会在输入缓存区内留下吸收过的任何东西,而且开头的空字符串gets()也会将之看作字符串吸收。
而scanf()在吸收字符串时会自动掠过开头的空白符(也就是对于他的来说的空字符串),而直至遇见一个非空白符才开始吸收, 并且遇见它的结束标志后,停止吸收字符,并且将该结束标志留在输入缓存区内。
char *p;
char a[20];
p = a;
scanf("%s",p); //输入hello world
for(int i = 0;i < sizeof(a);i++)
printf("%c",a[i]);
printf("\n");
return 0;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhOwrhm8-1584805963820)($resource/1584193136(1)].jpg)
注意观察上面两个输出结果,我们看到,scanf读取了一个符号在o的后面。
puts 函数
什么是 puts 函数?
puts 函数是 gets 函数的输出版本,他把指定的字符串写到标准输出并在末尾添上一个换行符。
putchar() 和 getchar()
getchar():从键盘输入一个字符,可以是回车,空格
putchar():和getchar()相对应,输出一个字符,接受整型参数(字符本质上也是整型的)
char a,b,c;
a=getchar();
b=getchar();
c=getchar();
putchar(a);
putchar(b);
putchar(c);
putchar('\0');//输出'\0'和输出' '都是输出一个空格
putchar('A' + 32); //输出小写的a