数组
数组的定义:
- arr[] arr和[]结合是数组
- 将确定的元素的个数放入[]中
- 用元素的类型 定义一个变量
- 从上往下整体替换
注:后面复杂数组的定义使用此方法
一维字符数组
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]=""; 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]=""; 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]={""}; 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; }
|