5.一维数组与字符数组
5.2 一维数组
数组:指一组具有相同数据类型的数据的有序集合。
一维数组的定义格式为
类型说明符 数组名[常量表达式];
如 int a[10]; 表示一个整型数组,数组名为a,它有10个元素
- 常量表达式中可以包含常量和符号常量,但不能包含变量
- 可以只给一部分元素赋值,如int a[10]={0,1,2,3,4};后面的值会默认为0
- 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度
//debug运行以下代码
#include <stdio.h>
int main() {
int a[]={1,2,3,4};
int b[10] = {1,2,3,4};
printf("a=\n");
return 0;
}
5.3 数组访问越界与数组的传递
#include <stdio.h>
int main() {
int i[5] = {1,2,3,4,5};
int j = 10;
int k = 20;
i[5] = 6;//越界访问
i[6] = 7;//越界访问会造成数据异常
printf("k=%d\n",k);
return 0;
}
因为越界访问,导致变量k存储地址的值被修改
数组另一个值得关注的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内
数组传递
#include <stdio.h>
void print(int b[],int len)
{
int i;
for(i=0;i<len;i++){
printf("%3d",b[i]);
}
b[4]=20;
printf("\n");
}
#define N 5
int main() {
int a[5]={1,2,3,4,5};
print(a,5);
printf("a[4]=%d\n",a[4]);
return 0;
}
数组传递时,只是把数组的起始地址传递给了子函数,长度不能传递给子函数,我们需要使用额外的变量,来把长度传递给子函数
5.4 字符数组与scanf读取字符串
字符数组初始化及传递
#include <stdio.h>
int main() {
char c[]={'h','e','l','l','o'};
char d[]="how";
printf("c=%s\n",c);
printf("d=%s\n",d);
return 0;
}
D:\CProject\5\5.3-char_array\cmake-build-debug\5_3_char_array.exe
c=hello€?
d=how
进程已结束,退出代码为 0
对数组赋值"hello"却打印出乱码,这是因为printf 通过%s打印字符串时,原理是依次输出每个字符,当读到结束符’\0’时,结束打印
我们通过print 函数模拟实现printf 的%s 打印效果,当c[i]为’\0’时,其值是0,循环结束,也可以写为c[i]!=‘\0’。
scanf读取字符串
#include <stdio.h>
int main() {
char c[10];
char d[10];
scanf("%s",c);
printf("%s\n",c);
scanf("%s%s",c,d);
printf("c=%s,d=%s\n",c,d);
return 0;
}
scanf 通过%s 读取字符串,对c 和d 分别输入"are"和"you"(中间加一个空格),scanf在使用%s 读取字符串时,会忽略空格和回车(这一点与%d 和%f 类似)。
5.5 gets与puts,str系列字符串操作函数
gets 函数与puts 函数
gets 函数类似于scanf 函数,用于读取标准输入。前面我们已经知道scanf 函数在读取字符串时遇到空格就认为读取结束,所以当输入的字符串存在空格时,我们需要使用gets 函数进行读取
函数puts 把str(字符串)写入STDOU(标准输出),相对于printf 函数,**puts 只能用于输出字符串,同时多打印一个换行符,**等价于printf(“%s\n”,c)。
#include <stdio.h>
int main() {
char c[20];
gets(c);
puts(c);
return 0;
}
str系列字符串操作函数
函数 | 作用 | 格式 | 备注 |
---|---|---|---|
strlen | 统计字符串长度 | size_t strlen(char *str); | strlen 是通过结束符’\0’来判断字符串长度的,如果没有结束符,无法统计字符串长度 |
strcpy | 将某个字符串复制到字符数组中 | char *strcpy(char *to, const char *from); | |
strcmp | 比较两个字符串的大小 | int strcmp(const char *str1, const char *str2); | str1中str2相等,返回值为0。str1大于str2,那么返回值为1;str1小于str2,那么返回值为−1 |
strcat | 将两个字符串连接到一起 | char *strcat(char *str1, const char *str2); |
#include <stdio.h>
int mystrlen(char c[]){
int i = 0;
while (c[i++]);
return i - 1;
}
int main() {
int len;
char c[20];
char d[100] = "world";
gets(c);
puts(c);
len = strlen(c);
printf("strlen len=%d\n",len);
len = mystrlen(c);
printf("mystrlen len=%d\n",len);
strcat(c,d);
strcpy(d,c);
puts(d);
printf("c?d %d\n",strcmp(c,d));
puts(c);
return 0;
}
D:\CProject\5\5.4-strlen\cmake-build-debug\5_4_strlen.exe
hello,
hello,
strlen len=6
mystrlen len=6
hello,world
c?d 0
hello,world
进程已结束,退出代码为 0