c语言使用scanf或者gets读取字符串时第一个字符缺失如何解决
代码:
printf("=> ACCOUNT\n");
char account[16];
scanf("%s", account);
fflush(stdin);
printf("=> PASSWORD\n");
char password[6];
scanf("%s", password);
fflush(stdin);
for(int i = 0 ; i < 16 ; i++)
printf("--%c--\n",account[i]);
for(int i = 0 ; i < 6 ; i++)
printf("--%c--\n",password[i]);
注:在之前的程序中使用过scanf读取单个字符,并且之后使用了fflush(stdin);清除缓冲区。
运行结果
换成gets和fgets也会缺失,不考虑输入的字符数量不为16的情况
-
因为字符输入时会在字符串结尾处多加一个'\0'表示字符串结束. 所以设置字符数组长度时要比输入的至少多加一个字符. 你输入16个字符.account字符数组长度就要至少是17. char account[17];
同样 password你输入6个字符. password字符数组长度就要至少是7. char password[7];
否则多加的'\0'会下标越界写入到 password数组分配空间之后的空间中, 因为 password和account所分配的内存空间地址可能是连着的,account内存空间地址在password内存空间地址之后, 这样多加的'\0'会下标越界写入到account[0]的内存空间中, account[0]的值就被意外的改变为'\0'了
-
测试了一下, 实际是都输出的。 所以你这个现象有偶然性,检查一下password和account的数组地址,看看是否password的地址和account的地址正好差6个字节。如果这样,那么输入password后,字符串结束符正好覆盖account的第一个字节。否则不会这种现象
发表回复