看板 C_and_CPP 關於我們 聯絡資訊
最近在寫一個程式,其中需要做下面的工作, 主要是將某個檔案內依特定格式儲存的資料 每一欄的資料分別存放至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)
ianfang:你哪有長度剛好 字串最後還要放'\0' 06/18 18:49
subeyes:那麼為什麼第二列的str2還是可以順利印出呢? 06/18 21:25
ianfang:C不做邊界檢查 這是無法預期的結果 運氣好罷了 06/18 22:19
subeyes:但我試過很多次 每一次都是str1抓不到 str2抓得到 06/18 23:07
subeyes:如果是機率問題 不是應該有時str1抓得到 有時str2抓不到? 06/18 23:08
subeyes:sry 因為我還不太瞭解為什麼會這樣 06/18 23:08
VictorTom:對於這種錯誤的程式碼造成的意外/不意外的結果.... 06/18 23:26
VictorTom:小弟我覺得asm/memory/register拉出來自己看吧.... 06/18 23:27
VictorTom:真有心研究的話, 是可以徹底了解運作的機制, 錯誤的原因 06/18 23:27
VictorTom:以及知道為什麼明明說是機率卻常常都是只有誰的問題.... 06/18 23:28
subeyes:好的 感謝二位的解答 :) 06/18 23:30
VictorTom:不然給您的簡單的提示, 不要只看%s印出來的字串.... 06/18 23:30
VictorTom:把str1與str2"每一個"都watch一下, 看看每一行執行完它 06/18 23:31
VictorTom:們的變化; 比如用memory看str1與str2, 或比較'稿剛'把 06/18 23:32
VictorTom:str1[0]~[4]與str2[0]~[4]都拉出來看一下.... 06/18 23:32
VictorTom:因為表面上是str1[0]被覆寫了'\0'所以才什麼都不印:) 06/18 23:34
VictorTom:您想了解原因, 就要找到為什麼str1[0]被錯誤覆寫到了. 06/18 23:36