相比較Java的鍵盤錄入,C語言的scanf有一些需要注意的細節,為了避免使用的時候踩坑,我們就來了解一下scanf。
scanf()是C語言的格式輸入函數,和printf函數一樣被聲明在stdio.h頭文件中,它的基本使用很簡單:
1 int a; 2 scanf("%d",&a);//程序執行到這里時,就等待用戶輸入;它接收的是變量的地址
//所以一般情況下除了指針型變量和數組名要給變量加上取地址符&
注意事項一:內存溢出(輸入的類型要和占位符一致就不拿出來單獨啰嗦了)
1 char s[1];//長度為1,只能存一個元素 2 printf("請輸入s的值:"); 3 //因為這里使用的是數組名,數組名就是地址,所以不用加取地址符& 4 scanf("%s",s); //輸入abcd 5 printf("s=%s\n",s);
誒,照結果來看abcd都被存進字符數組s里面了,但是我們知道,s是不是只能存一個字節的數據,所以bcd已經非法占用內存了。雖然有時候程序看起來會正常執行,但是它會留下一些隱患。使用的時候需要注意這一點。
注意事項二:錄入多個變量
1 double m,n; 2 printf("請輸入m、n:"); 3 //占位符不寫東西時,錄入的時候默認以空格分隔
//如果占位符用逗號分隔,錄入的時候用逗號分隔 4 scanf("%lf%lf",&m,&n);// scanf("%lf,%lf",&m,&n); 5 printf("n=%lf m=%lf\n",m,n);
如果我將第四行代碼換成注釋的代碼就需要這樣用:
輸入的時候用空格分隔會發生什么呢
可以看到,n的值沒能錄入。建議使用默認的分隔符,占位符中不要自己加東西。
注意事項三:char類型
1 char name[10]=""; 2 int age=0; 3 double sal=0.0; 4 char gender='a';//m代表man w代表woman 5 6 printf("請輸入名字:"); 7 scanf("%s",name);//數組名,不用加& 8 9 printf("請輸入年齡:"); 10 scanf("%d",&age); 11 12 printf("請輸入薪水:"); 13 scanf("%lf",&sal); 14 15 printf("請輸入性別:"); 16 //scanf中char類型會出現接收上面的回車字符,一個字節被占了,所以獲取不到錄入的數據 17 scanf("%c",&gender); 18 //所以再接收一次 19 scanf("%c",&gender); 20 21 printf("姓名:%s \n年齡:%d \n薪水:%lf \n性別:%c",name,age,sal,gender);
先看一下去掉19行代碼會發生什么:
亂吧,性別沒法輸入吧;加上19行之后,也就是再獲取一次字符之后: