bug来源
#include<stdio.h>
#include<string.h>
int main()
{
char username[10];
char password[6];
printf("请输入用户名")
gets(username)
printf("请输入密码")
gets(password)
//省略其他部分
问题
在输入用户名admin
和密码123456
之后,用户名变量username
不能正常输入数据。
原理
gets
函数在接收标准输入后会自动在字符数组后面加上\0
作为结束符,由于字符数组password
定义时分配的内存空间少于实际需要输入的空间,导致结束符\0
输入到了字符数组username
初始内存位置。username
内存空间内实际内容是\0dmin
,输出\0
即无内容。
C语言分配内存的顺序
定义的局部变量在栈区,先定义,后分配(栈:先进后出的数据结构)。先定义的先入栈(在栈内不分配空间),出栈的时候后入栈的先分配,分配的地址要比先分配的地址大。
puts
函数输出原理
puts
函数输出一个字符串,从字符数组的首地址开始,到内存中读取到\0
为止,最后输出\n
。
所以在输出username
时,首地址即是\0
,所以只会输出换行符\n
。
解决办法
增加字符数组定义长度。
char username[10];
//char password[6];
char password[7];