2008年6月24日 星期二

scanf("") - 參

input case:存在 input.txt 內
1

RSAEIO
2
5
RTSSKAEAGE

程式碼:
#include <stdio.h>

int main(){

freopen("input.txt","r",stdin);
char input;
while(input!='5'){
scanf("%c",&input);
printf("%d - \t %c\n",input,input);
}
return 0;
}

output:
49 - 1
10 -

10 -

82 - R
83 - S
65 - A
69 - E
73 - I
79 - O
10 -

50 - 2
10 -

53 - 5

如果把 scanf("%c",&input); 改成
  • scanf("%c ",&input); (%c 後面加空白)
  • scanf(" %c",&input); (%c 前面加空白)
  • scanf("%c\n",&input); (%c 後面加 \n )
  • scanf("\n%c",&input); (%c 前面加 \n )
會得到同樣的 output
49 - 1
82 - R
83 - S
65 - A
69 - E
73 - I
79 - O
50 - 2
53 - 5
更有趣的是,如果將 scanf() 與 gets 合用
#include <stdio.h>

int main(){
freopen("input.txt","r",stdin);
char input,line[50];
while(scanf("%c",&input)!=EOF){
printf("%d - \t %c\n",input,input);
gets(line);
printf("gets - %d\t%c\t",line[0],line[0]);
puts(line);
}
return 0;
}

output 變成:
49 - 1
gets - 0
10 -

gets - 82 R RSAEIO
50 - 2
gets - 0
53 - 5
gets - 0
82 - R
gets - 84 T TSSKAEAGE
因為 scanf() 把第一個字讀進去後,下一個字元是 '\n' ,gets() 讀取到 '\n' 就會停止讀取,並且附加一個 null character 在字串尾端,而這個字串又沒有任何字元,才會出現 line[0]=0 的狀況,如果將原本的 scanf() 改成 scanf("%c ",&input); (%c 後面加上空白),output 就會變成

49 - 1
gets - 82 R RSAEIO
50 - 2
gets - 53 5 5
82 - R
gets - 84 T TSSKAEAGE

input 裡面的 '\n' 都會被跳過,直接讀取一般的字母。

嗯,昨天我在這邊卡了將近一個小時...

沒有留言: