[問題] sscanf

看板C_and_CPP作者 (嘿)時間15年前 (2009/06/18 18:43), 編輯推噓5(5012)
留言17則, 3人參與, 最新討論串1/3 (看更多)
最近在寫一個程式,其中需要做下面的工作, 主要是將某個檔案內依特定格式儲存的資料 每一欄的資料分別存放至4個變數或陣列中, 最後輸出至螢幕 舉例來說,輸入檔的內容為: John 4 Mary 5 Harry 8 Jason 21 那麼程式當中則分別用str1, a, str2, b四個變數來存放每一欄的資料 (即第一行中str1="John", a=4, str2="Mary", b=5, 第二行中str1="Harry", a=8, str2="Jason", b=21) 所以第一個就想到用sscanf做 以下是簡化過的程式碼: #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void){ int i; int count=0; char input[30]; char str1[5], str2[5]; int a,b; while(fgets(input,25,stdin)!=NULL){ input[strlen(input)-1]='\0'; sscanf(input,"%s %d %s %d", str1, &a, str2, &b); printf("str1=%s a=%d str2=%s b=%d\n", str1, a, str2, b); count++; } return 0; } 之所以要把每一行的'\n'改為'\0'是為了往後程式的需要。 但輸出的結果卻是: str1=John a=3 str2=Mary b=4 str1= a=8 str2=jason b=21 之後將str1的長度加大就沒問題了, 但還是想瞭解一下為什麼長度剛好的時候沒辦法抓到值呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.109.48 ※ 編輯: subeyes 來自: 203.70.109.48 (06/18 18:48)

06/18 18:49, , 1F
你哪有長度剛好 字串最後還要放'\0'
06/18 18:49, 1F

06/18 21:25, , 2F
那麼為什麼第二列的str2還是可以順利印出呢?
06/18 21:25, 2F

06/18 22:19, , 3F
C不做邊界檢查 這是無法預期的結果 運氣好罷了
06/18 22:19, 3F

06/18 23:07, , 4F
但我試過很多次 每一次都是str1抓不到 str2抓得到
06/18 23:07, 4F

06/18 23:08, , 5F
如果是機率問題 不是應該有時str1抓得到 有時str2抓不到?
06/18 23:08, 5F

06/18 23:08, , 6F
sry 因為我還不太瞭解為什麼會這樣
06/18 23:08, 6F

06/18 23:26, , 7F
對於這種錯誤的程式碼造成的意外/不意外的結果....
06/18 23:26, 7F

06/18 23:27, , 8F
小弟我覺得asm/memory/register拉出來自己看吧....
06/18 23:27, 8F

06/18 23:27, , 9F
真有心研究的話, 是可以徹底了解運作的機制, 錯誤的原因
06/18 23:27, 9F

06/18 23:28, , 10F
以及知道為什麼明明說是機率卻常常都是只有誰的問題....
06/18 23:28, 10F

06/18 23:30, , 11F
好的 感謝二位的解答 :)
06/18 23:30, 11F

06/18 23:30, , 12F
不然給您的簡單的提示, 不要只看%s印出來的字串....
06/18 23:30, 12F

06/18 23:31, , 13F
把str1與str2"每一個"都watch一下, 看看每一行執行完它
06/18 23:31, 13F

06/18 23:32, , 14F
們的變化; 比如用memory看str1與str2, 或比較'稿剛'把
06/18 23:32, 14F

06/18 23:32, , 15F
str1[0]~[4]與str2[0]~[4]都拉出來看一下....
06/18 23:32, 15F

06/18 23:34, , 16F
因為表面上是str1[0]被覆寫了'\0'所以才什麼都不印:)
06/18 23:34, 16F

06/18 23:36, , 17F
您想了解原因, 就要找到為什麼str1[0]被錯誤覆寫到了.
06/18 23:36, 17F
文章代碼(AID): #1AEXfWj6 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AEXfWj6 (C_and_CPP)