C语言字符串数组的小坑
有这么一段C语言代码:
#include <stdio.h>
#include <string.h>
using namespace std;
struct student{
char num[3];
char name[20];
char sex;
int age;
}students[1000];
int main()
{
int n, m, x;
while(scanf("%d", &n)!=EOF){
for(int i=0; i<n; i++){
scanf("%s", students[i].num);
getchar();
scanf("%s", students[i].name);
getchar();
scanf("%c", &students[i].sex);
scanf("%d", &students[i].age);
printf("--\n%s\n%s\n%c\n%d\n--", students[i].num, students[i].name, students[i].sex, students[i].age);
}
printf("over");
}
return 0;
}
在我进行测试的时候,出现了下面的结果
是不是很奇怪,我在输出num的时候时001ssr
所以是为什么呢?
解释
C语言将数组作为字符串存储时,最后一位默认是’\0‘,标志着字符串的结束。
所以比如我们将abc这三个字母存入字符串数组时,它实际占用了四个位置。
在上面的代码中,因为我定义了num[3]
,所以在读入时001分别占据了num[0] num[1] num[2]
,也就意味着结尾处没有’\0‘
标记,又由于系统在分配内存空间时是连续的,所有下一位就存储了name[0] = s
,在进行输出num的时候当输出完001
此时并没有碰到字符串的结束符,所以会继续向下,输出ssr
,因为name数组的空间足够大,所以在输出num[2] = r
时,碰到了name[3] = '\0'
,此时代表着字符串的结束。
这也就是出现上面错误的原因了。
所以在预设的时候,一定要记得数组要适当的大一点