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);清除缓冲区。

运行结果

img

换成gets和fgets也会缺失,不考虑输入的字符数量不为16的情况

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

fflush()只能对输出流操作。如果你对输入流调用fflush(),其行为是未定义的。
https://en.cppreference.com/w/c/io/fflush

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

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img