鐵之狂傲

 取回密碼
 註冊
搜尋

切換到指定樓層
1#
25鐵幣
getchar輸出,一次一個字元,最後一個是什麼字元?
#include<stdio.h>
#include<stdlib.h>
main(){
       char a;
       do {
           a = getchar();
           printf("%c%d " , a ,sizeof(a));
           
           }while(a != 'e');
       system("pause");
       }

這是一個輸入字串的程式
字串中遇到e就會停止
螢幕上會依序顯示出每個字元,並且在字元後面顯示出該字的記憶體大小(byte)
執行結果如下
magical
m1 a1 g1 i1 c1 l1
1

請問最後面那個一是什麼?
如果是\n字元的話,為什麼它會再下一行出現?


有人教我使用ACSII碼看看
所以我改成


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. main(){
  4.        char a;
  5.        do {
  6.            a = getchar();
  7.            printf("%c%x%d " , a , a ,sizeof(a));
  8.            
  9.            }while(a != 'e');
  10.        system("pause");
  11.        }

複製代碼


結果如下

  1. magical
  2. m6d1 a611 g671 i691 c631 a611 l6c1
  3. a1
複製代碼

是a1耶,不過這個代表什麼意思= =?

而且最後一個字原因該是什麼東西才對?

會是\n?
還是\0?

[ 本文最後由 magicalloveshe 於 07-7-12 12:53 AM 編輯 ]

最佳解答

傲月光希 檢視完整內容

為什麼會這樣? 我們要輸入字元時,輸入完畢後一定都會按ENTER ENTER這個鍵在程式中有兩種涵義 第一個就是將輸入的字元存到變數中,第二就是將剩下的字元存在暫存區 當輸入完一個字元時,按一下ENTER,其實這個動作不只是只有你輸入的那個字,還有換行字元\n 因為迴圈的關係,當第一次輸入完m時,enter會將m存到變數a裡,然後將\n存到暫存區 經過迴圈之後,又回到要輸入的地方 這時候,變數a會自動的讀取到\n這個換行字元,並 ...
 
轉播0 分享0 收藏0

回覆 使用道具 檢舉

為什麼會這樣?
我們要輸入字元時,輸入完畢後一定都會按ENTER

ENTER這個鍵在程式中有兩種涵義

第一個就是將輸入的字元存到變數中,第二就是將剩下的字元存在暫存區

當輸入完一個字元時,按一下ENTER,其實這個動作不只是只有你輸入的那個字,還有換行字元\n

因為迴圈的關係,當第一次輸入完m時,enter會將m存到變數a裡,然後將\n存到暫存區

經過迴圈之後,又回到要輸入的地方

這時候,變數a會自動的讀取到\n這個換行字元,並不會有新的輸入

之後,因為printf的關係,會先印出\n這個字元,也就是會換行,然後再印出\n的大小,也就是1,這就是為啥1會出現在下一行的原因

等到下一次,因為沒有按過enter,所以沒有字元在暫存區了,因此又可以新的輸入

解決策略
在a=getchar()下面寫上fflush(stdin)

這個程式碼就是用來清除暫存區的字元,好讓你下一次有新的輸入

以上資料
by我的不專業的回答

(ps 好棒,第一次有我可以幫忙的地方XD)
----------------------------
你新的修改法我剛剛去試時沒出現什麼a1啊~

我忘記我修正過了XD
----------------------------
我前面說錯
其實存在暫存區的不是\n,而是LF(Line Feed),這是按ENTER過後會產生的字元

之所以會換行的原因是因為getchar()這個函數本身在輸入完字元之後會自動換行
----------------------------
為什麼改成%x會出現a1呢?

其實,你將%c%x%d三個分開來,會發現其實a跟1是分開的

a又是什麼,而1又是什麼?
a代表的是LF這個字元的ASCII碼,1是它所佔的位元組
由於LF是不可列印字元,所以經過%c是印不出來的

解決方法如上

[ 本文最後由 傲月光希 於 07-7-12 01:23 AM 編輯 ]
 
進入數學版  滿月祭III相簿1  2

回覆 使用道具 檢舉

你需要登入後才可以回覆 登入 | 註冊

存檔|手機版|聯絡我們|新聞提供|鐵之狂傲

GMT+8, 24-7-6 04:38 , Processed in 0.023002 second(s), 20 queries , Gzip On.

回頂部