Re: [問題] sscanf的奇怪問題@@?
※ 引述《tropical72 (藍影)》之銘言:
: 恕刪
: 推 james732:推板主 04/29 13:53
: 推 bestwishes:我也喜歡這種作法 在JAVA底下尤其好做 04/29 13:57
: 推 xatier:推板主,這個解更棒 04/29 14:25
: 推 piness:謝謝版主!!又多學了一招 04/29 14:35
: 推 tropical72:我比較建議原本的空白先取代成 ASCII(255),看起來也是 04/29 20:53
: → tropical72:空白,再用ASCII(20)去取代沒意義的東西.再將255取回來, 04/29 20:53
: → tropical72:我常遇到的問題便是原先空白不可抹掉 04/29 20:54
: → tropical72:取回動作通常不做,因看起來都是 space XD 04/29 20:55
: 修正,上述的 ASCII(20) 應為 ASCII(32),進制記錯
: : 可是這會有signed/unsigned的問題, 請問有除了255以外的解決方案嗎?
: : 想到用 '\t' 之類的應該也可以, 只是沒試過~
: 的確 signed/unsigned 問題之前沒實際考量過,
: 但若單純為 sscanf 使用,使用 ASCII 255 應為合理,
: 當然較保險的方式是 #define / const 一個出來
: const unsigned char FALSE_SPACE_UNI = (unsigned char)(0xff)
: const char FALSE_SPACE_SIG = ( char)(0xff)
: 之所以不再取代回去,純粹是因為「看起來像」是 space,實際上卻不是 ASCII(32),
: 若考慮寫入檔案日後仍有維護之需求,才有必要再將 ASCII(255) 換回 ASCII(32)
: 至於再換成 '\t' ,那又回到了解這問題的原點:
: sscanf\scanf 是以 white space 為斷點,其中便包含了 ' ', '\t', '\n'
: 所以換成 '\t' 應不適用於這裡
: 三個字元,會找一個「看起來是空白,實際上卻不是空白」的去取代,
: 純粹是為了避開此問題,目前用這種方式處理倒是還沒出過包,
: 如此方式有問題的話也請不吝指正,避免日後出包不知道怎麼死的。
: 程式碼大概如下
: #include <stdio.h>
: #include <string.h>
: void replace(char *str)
: {
: char* ptr=strchr(str, ' ');
: while(ptr!=NULL){
: *ptr = 255;
: ++ptr;
: ptr = strchr(ptr, ' ');
: }
: }
: int main()
: {
: char demo[] = "goodbye my love\nptt cpp\nthis is a test\n";
: char str1[200], str2[200], str3[200];
: printf("%s\n", demo), replace(demo);
: sscanf(demo, "%s%s%s", str1, str2, str3);
: printf("str1:%s\n", str1);
: printf("str2:%s\n", str2);
: printf("str3:%s\n", str3);
: return 0;
: }
: 此處便不把 str1, str2, str3 之 255 replace 回來,輸出結果「看」起來正常.
我可能沒有非常懂你的解法。
可是你要的結果,不是這樣就好了?
scanf很好用呀...
#include <stdio.h>
int main()
{
char demo[] = "goodbye my love\nptt cpp\nthis is a test\n";
char str1[200], str2[200], str3[200];
sscanf(demo, "%[^\n]\n%[^\n]\n%[^\n]\n", str1, str2, str3);
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
printf("str3:%s\n", str3);
return 0;
}
--
I'm CAT (Combinatorics, Analysis, and Topology)
About Me :
http://columbia.edu/~mt2767
想找程式或數學家教,還是發包程式案件嗎?
http://w.csie.org/~b95028/parttime.php
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.90.67
※ 編輯: scan33scan33 來自: 140.112.90.67 (04/30 17:04)
推
05/01 15:11, , 1F
05/01 15:11, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章