ACCOUNT\n"); char account[16]; scanf("%s", account); fflush(stdin); printf("=> PASSWORD\n"); char passw">

c语言使用scanf或者gets读取字符串时第一个字符缺失如何解决

毕设工坊 论文问答 1

代码:

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的情况

回复

共2条回复 我来回复
  • 代码海岸
    这个人很懒,什么都没有留下~
    评论

    因为字符输入时会在字符串结尾处多加一个'\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'了

    0条评论
  • 毕设小屋
    这个人很懒,什么都没有留下~
    评论

    测试了一下, 实际是都输出的。 所以你这个现象有偶然性,检查一下password和account的数组地址,看看是否password的地址和account的地址正好差6个字节。如果这样,那么输入password后,字符串结束符正好覆盖account的第一个字节。否则不会这种现象

    0条评论

发表回复

登录后才能评论