1. 定义和初始化
char s[100] = "hello";char s[] = "hello"
- 局部字符数组不初始化为垃圾值
- 全局字符数组不初始化为0(0==’\0’)
- 不满补0(即补’\0’)
2. 遍历
- i < strlen(s)
- s[i] != ‘\0’
for(int i=0; s[i]!='\0'; i++)for(int i=0; i<strlen(s); i++)
3. 输入输出
putchar() s[i] = getchar()printf scanfgets puts
4. NOTES
0 ‘0’ ‘\0’ NULL:
- ‘\0’ ==> 对0进行转义
- ‘\0’==0,’0’==48,NULL用于指针
缓冲区溢出和攻击问题
- scanf读入字符串,gets读入字符串,fgets读入字符串
- gets溢出
scanf读入%c 和 %d的过程
scanf:空格分隔,不吸收刷新缓冲区用的enter
按要求输入(scanf输入格式对空格不敏感,但是对其他符号敏感)
enter刷新缓冲区(出来的东西有原来缓冲区的东西然后是enter),缓冲区内部以空格和制表符为间隔
除了%c之外都会跳过空白字符(enter,空格,制表符) %c不会跳
不涉及%c该怎么干怎么干,如果涉及字符读取,就要在scanf后加个东西来吸收换行符
- gets:一次一行,吸收刷新缓冲区用的enter
fgets(将刷新用的enter也一并读进去) gets(将刷新用的enter变为’\0’)
- fgets:一次一行,会读入刷新缓冲区用的enter ```cpp //实验:enter会留在缓冲区中 //输入:hello=>10 hello world=>32 char str[50]; scanf(“%s”, str); //char str2[50]; //scanf(“%s”, str2); char ch; scanf(“%c”, &ch); printf(“%d”, ch);
int a;
char ch;
scanf(“%d”, &a);
scanf(“%c”, &ch);
printf(“%d”, ch);
scanf(“%c”, &ch);
printf(“%d”, ch);
char str[50]; fgets(str, sizeof(str), stdin); gets(str); char ch; scanf(“%c” ,&ch); putchar(ch);
<br /><br />[第8章 指针-7缓冲区溢出与缓冲区溢出攻击.pdf](https://www.yuque.com/attachments/yuque/0/2021/pdf/1079241/1615373883782-257babc8-3591-42d5-a13c-ac16e21e6f70.pdf?_lake_card=%7B%22uid%22%3A%221584084696197-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fpdf%2F1079241%2F1615373883782-257babc8-3591-42d5-a13c-ac16e21e6f70.pdf%22%2C%22name%22%3A%22%E7%AC%AC8%E7%AB%A0+%E6%8C%87%E9%92%88-7%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E4%B8%8E%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB.pdf%22%2C%22size%22%3A409252%2C%22type%22%3A%22application%2Fpdf%22%2C%22ext%22%3A%22pdf%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22kyLKc%22%2C%22card%22%3A%22file%22%7D)<a name="LXEcC"></a>###printf打印较长的字符串```cppprintf("hello world"" china");
