关于字符串的理解
今天在刷题时,在调试的过程中发现了一个问题:student是个包含char ID[9],int De,int Cai的结构体,现在要对成绩及格的学生进行排名,用scanf输入所有学生的数据后,我想要把成绩不及格的学生学号改为'0'以此来标记不参与排名,但是却没有达到预期效果。原程序是这样写的:调试结果:可以看出,实际效果并没有把学号整体修改为'0',而只是把学号的首位修改为‘0’.
问题描述
今天在刷题时,在调试的过程中发现了一个问题:student是个包含char ID[9],int De,int Cai的结构体,现在要对成绩及格的学生进行排名,用scanf输入所有学生的数据后,我想要把成绩不及格的学生学号改为'0'以此来标记不参与排名,但是却没有达到预期效果。
原程序是这样写的:
for (int i = 0; i < N; i++) {//N是输入的学生个数
if (student[i].De < L || student[i].Cai < L) {//L是及格线
*student[i].ID = '0';
}
调试结果:
可以看出,实际效果并没有把学号整体修改为'0',而只是把学号的首位修改为‘0’.
经搜索思考发现,student[i].ID='0'实际上等价于student[i].ID[0]='0',因为数组名是表示的是数组的第一个元素的地址,而student[i].ID就是一个数组。所以才会出现只修改数组第一个元素的情况。
解决方法
以下给出两种解决办法:
一.写为*student[i].ID='\0';
调试结果:
可以发现此时student.ID变为了空数组,这是因为在C语言中,字符串的定义是“以'\0'为结尾的字符序列”,当数组首元素为'\0'时,自动判定此数组为空数组。
二.写为strcpy(student[i].ID, "0");
调试结果:
非常完美,完全符合预期。
那么这里为什么" "里面可以出现单个字符呢?我们要从strcpy函数的声明说起:
strcpy函数的声明:char *strcpy(char *dest, const char *src)
dest指向用于存储复制内容的数组,src则是要复制的字符串。注意,这里一定是字符串而非字符,也就是说不能写成strcpy(student[i].ID, '0');strcpy的工作原理实际上是读取给出的字符串,直到遇见'\0'停止,也就是说"0"实际上是包含了'0'和'\0',读取完'0'后停止读取。
更多推荐
所有评论(0)