相比較Java的鍵盤錄入,C語言的scanf有一些需要註意的細節,為了避免使用的時候踩坑,我們就來瞭解一下scanf。 scanf()是C語言的格式輸入函數,和printf函數一樣被聲明在stdio.h頭文件中,它的基本使用很簡單: 1 int a; 2 scanf("%d",&a);//程式執行到 ...
相比較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行之後,也就是再獲取一次字元之後: