bug來源
#include<stdio.h>
#include<string.h>
int main()
{
char username[10];
char password[6];
printf("請輸入用戶名")
gets(username)
printf("請輸入密碼")
gets(password)
//省略其他部分
問題
在輸入用戶名admin
和密碼123456
之后胧瓜,用戶名變量username
不能正常輸入數(shù)據(jù)啤覆。
原理
gets
函數(shù)在接收標(biāo)準(zhǔn)輸入后會自動在字符數(shù)組后面加上\0
作為結(jié)束符,由于字符數(shù)組password
定義時分配的內(nèi)存空間少于實際需要輸入的空間宅楞,導(dǎo)致結(jié)束符\0
輸入到了字符數(shù)組username
初始內(nèi)存位置针姿。username
內(nèi)存空間內(nèi)實際內(nèi)容是\0dmin
,輸出\0
即無內(nèi)容厌衙。
C語言分配內(nèi)存的順序
定義的局部變量在棧區(qū)距淫,先定義,后分配(棧:先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu))婶希。先定義的先入棧(在棧內(nèi)不分配空間)榕暇,出棧的時候后入棧的先分配,分配的地址要比先分配的地址大。
puts
函數(shù)輸出原理
puts
函數(shù)輸出一個字符串彤枢,從字符數(shù)組的首地址開始狰晚,到內(nèi)存中讀取到\0
為止,最后輸出\n
缴啡。
所以在輸出username
時壁晒,首地址即是\0
,所以只會輸出換行符\n
业栅。
解決辦法
增加字符數(shù)組定義長度秒咐。
char username[10];
//char password[6];
char password[7];