1. 定义和初始化

  1. char s[100] = "hello";
  2. char s[] = "hello"
  • 局部字符数组不初始化为垃圾值
  • 全局字符数组不初始化为0(0==’\0’)
  • 不满补0(即补’\0’)

2. 遍历

  • i < strlen(s)
  • s[i] != ‘\0’
  1. for(int i=0; s[i]!='\0'; i++)
  2. for(int i=0; i<strlen(s); i++)

3. 输入输出

  1. putchar() s[i] = getchar()
  2. printf scanf
  3. gets 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);

  1. ![读入字符的问题.PNG](https://cdn.nlark.com/yuque/0/2020/png/1079241/1583769842287-bcea6f1d-e650-4dba-a925-3dc053b8c936.png#align=left&display=inline&height=174&name=%E8%AF%BB%E5%85%A5%E5%AD%97%E7%AC%A6%E7%9A%84%E9%97%AE%E9%A2%98.PNG&originHeight=512&originWidth=1066&size=328358&status=done&style=none&width=363)<br />![缓冲区溢出.PNG](https://cdn.nlark.com/yuque/0/2020/png/1079241/1584084624622-4d3f6956-dd66-4417-bb05-6f8d67406f82.png#align=left&display=inline&height=182&name=%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA.PNG&originHeight=531&originWidth=1031&size=245283&status=done&style=none&width=353)![缓冲区攻击.PNG](https://cdn.nlark.com/yuque/0/2020/png/1079241/1584084617876-3725e5f6-f435-4304-b8ca-a49c1d6b7af8.png#align=left&display=inline&height=145&name=%E7%BC%93%E5%86%B2%E5%8C%BA%E6%94%BB%E5%87%BB.PNG&originHeight=415&originWidth=1044&size=100517&status=done&style=none&width=365)<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)
  2. <a name="LXEcC"></a>
  3. ###
  4. printf打印较长的字符串
  5. ```cpp
  6. printf("hello world"
  7. " china");