C语言学习
目录
第一天
数据类型
- 下载安装C/C++语言编译工具--QT(下载链接)。
- C语言的数据类型:
- 转载:https://www.runoob.com/cprogramming/c-data-types.html
整型数据
浮点类型
void类型
基本类型书写
printf函数规定符列举
转义字符列举
字节对齐:
指定数据类型的变量存放的起始地址数值必须是其对应数据类型所占字节的整数倍
比如:
上图中:结构体C的成员占据10个字节,而结构体C的有效对齐值是其成员b的自身对齐值4,10不是4的倍数,故还需补齐两个字节,此时结构体C占据12个字节,是4的倍数。
printf("%-10d\n",60); //左对齐60后面补齐10个空格
printf("%10d\n",60); //右对齐60前面补齐10个空格
printf("%10.3f\n",1.12356); //%10.3f作用为:四舍五入保留3位有效数字 所以输出为1.124
printf("%f\n",12345678e-5); //小数的指数法输出123.456790 因为float为单精度浮点数,只能保留6位有效数字
条件注释注释:#if0 #endif
可以成对嵌套使用:
#if 0
sss #endif
第二天
printf()函数:
- 调试C程序:gdb, printf(使用printf调试时必须加换行符,因为要把输出缓冲区的内容输出出来)。
- printf函数返回值的含义:返回最终打印字符的个数,不包括格式符因为最终结果,格式符被具体数值替换了,而包括转义字符(eg:\n, \t,等等,除了'\0'空字符)。
int m;
m=printf("Hello World!\n");
printf("m=%d\n",m);
输出为:m=13.
printf()函数里'\n'的含义:
(1)换行
(2)将输出缓冲区中的所有字符输出
scanf()函数:scanf(参数,&地址)
(1)第一个参数字符里不能有换行符 \n
(2)从第二参数起,必须是变量地址
(3)在两个数据之间可以用一个或多个空格、tab 键、回车键分隔
(4)在用 %c 输入时,空格和"转义字符"均作为有效字符。
scanf 类型说明符:
类型 | 合格的输入 | 参数的类型 |
---|---|---|
%a、%A | 读入一个浮点值(仅 C99 有效)。 | float * |
%c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 | char * |
%d | 十进制整数:数字前面的 + 或 - 号是可选的。 | int * |
%e、%E、%f、%F、%g、%G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 | float * |
%i | 读入十进制,八进制,十六进制整数 。 | int * |
%o | 八进制整数。 | int * |
%s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char * |
%u | 无符号的十进制整数。 | unsigned int * |
%x、%X | 十六进制整数。 | int * |
%p | 读入一个指针 。 | |
%[] | 扫描字符集合 。 | |
%% | 读 % 符号。 |
实例:
scanf("%d%d",&m,&n);
printf("%d,%d",m,n);
输入为:12 15(中间有空格) 输出为:12,15
int m,n;
scanf("%d,%d",&m,&n);
printf("%d,%d\n",m,n);
输入为:12 ,15(中间必须有‘,’且',' 前一定要紧跟在数字后面,数字与 ', '之间不能有空格) 输出为:12,15
scanf("%c%c%c",&a,&b,&c);
printf("%c,%c,%c\n", a,b,c); return 0; }
产生以下结果:
$ ./a.out 请输入三个字符:run r,u,n $ ./a.out 请输入三个字符:r u n r, ,u
printf("请输入用户名:");
scanf("%s", str1);
printf("请输入您的网站:");
scanf("%s", str2);
printf("输入的用户名:%s\n", str1);
printf("输入的网站:%s", str2);
运行结果为:
请输入用户名:admin 请输入您的网站:www.runoob.com 输入的用户名:admin 输入的网站:www.runoob.com
getchar putchar
- getchar是以行为单位进行存取的。
- getchar函数每次从缓冲区中得到一个字符,putchar函数每次输出一个字符。
- 结束一个文件的输入就需用到EOF (Enf Of File)
- 如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键
- 为什么要用int型来接受getchar函数:因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1.
while((c = getchar()) != EOF){ putchar(c); }
上述结果, 必须输入是文件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D,getchar才会停止执行,循环才能结束,整个程序将会往下执行
#include "stdio.h"
main()
{
char
c,d,e,f;
printf
(
"please input two characters:\n"
);
c=
getchar
();
putchar
(c);
putchar
(
'\n'
);
d=
getchar
();
putchar
(d);
putchar
(
'\n'
);
e=
getchar
();
putchar
(e);
putchar
(
'\n'
);
f=
getchar
();
putchar
(f);
putchar
(
'\n'
);
printf
(
"c= %c\n"
,c);
printf
(
"d= %c\n"
,d);
printf
(
"e= %c\n"
,e);
printf
(
"f= %c\n"
,f);
}
运行后先输入“12”,回车,再输入“34”,回车。运行流程:
- 首先输入了两个字符12,然后回车,注意这时写入缓存中的有3个字符1,2,回车。
- 程序中有四个getchar(),于是c='1',d='2',e='\n'。
- 这时运行到f=getchar();输入缓存中的三个字符均被前三个getchar获取,这时需要用户输入,
- 这里输入了34
- 于是f='3',4和后面的回车没有被利用。
- 这便是整个流程。
运算符
- 双目运算符:+ - * / %
- 单目运算符: ++ --
- 自动转换: char<short<int<float<double eg: 'c '+3 被强制转换成整型
- 遇到长的运算时,应该从右往左算:
a=10; b = a+=a*=a-=a+a;
运算过程即:a+a=20; a=a-20=-10; a=a*a=100; a=a+a=200; b=a=200;
————————————————