C语言 day3 | 我的日常分享

C语言 day3

数组

数组的定义:

  1. arr[] arr和[]结合是数组
  2. 将确定的元素的个数放入[]中
  3. 用元素的类型 定义一个变量
  4. 从上往下整体替换
    注:后面复杂数组的定义使用此方法

一维字符数组

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(int argc,char *argv[]){
char str1[] = {'h','e','l','l','o'};
char str2[6] = {'h','e','l','l','o'};
char str3[] = "hello";
printf("str1=%s,sizeof(str1)=%d\n",str1,sizeof(str1));
printf("str2=%s,sizeof(str2)=%d\n",str2,sizeof(str2));
printf("str3=%s,sizeof(str3)=%d\n",str3,sizeof(str3));

return 0;
}

运行结果:
图片
分析:由于str1没有中没有'\0'所以以%s格式化输出时不会停止,会打印后面内存中的值,直到在后面的内存中遇到'\0'才会停止;
str2中总大小是6字节,初始化了5个元素,剩下一个未初始化的元素会自动初始化为0,然而0'\0'在内存中储存形式是一致的,即等效
str3""字符串的方式进行初始化,字符串的末尾系统会自动加'\0'

案例1:获取键盘字符串

1
2
3
4
5
6
7
#include<stdio.h>
int main(int argc,char *argv[]){
char str[128]="";
scanf("%s",str);
pritnf("%s",str);
return 0;
}

缺点:scanf()遇到空格会结束输入,无法输入空格”hello world”
改进1:

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(int argc,char *argv[]){
char str[128]="";
// scanf("%s",str);
gets("%s",str);
fgets(str,sizeof(str),stdin);
printf("str=%s", str);
return 0;
}

优点:可以获取到空格
缺点:gets()获取输入时,不会去管str的大小,容易造成内存污染
如图:定义的str长度为5但是输入的字符长度大于5,依然存到内存中去了,如果后面内存有重要的数据,则污染了
图片

改进2:使用fgets()
参数:第一个:存到哪 第二个:最大长度 如3,则只会存2个字符 第三个:字符来源 stdin(标准输入设备)
原型:图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
int main(int argc,char *argv[]){
char str[128]="";
// scanf("%s",str);
//gets("%s",str);
fgets(str,sizeof(str),stdin);
printf("str=%s", str);
return 0;
}
```
优点:既能获取到空格,又能保证字符数组不越界,推荐使用


### 二维字符数组
一维字符数组是存放多个字符
二维字符数组是存放多个字符串 每个字符串占一行
```C
//二维数组 初始化时可以省略行标 不能省略列标
char str[][16]={"haha","xixi","heihei"};
```
案例:输入 输出
```C
#include<stdio.h>
int main(int argc,char *argv[]){
// char str[3][16]="";
char str[3][16]={""};
int i=0;

for(i=0;i<3;i++){
scanf("%s",str[i]);
}

for(i=0;i<3;i++){
printf("str[%d]=%s\t",i,str[i]);
}
return 0;
}

图片