為什麼這篇Sscanf return value鄉民發文收入到精華區:因為在Sscanf return value這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者tropical72 (藍影)看板C_and_CPP標題Re: [問題] sscanf的奇怪問題...
恕刪
修正,上述的 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 回來,輸出結果「看」起來正常.
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.222
※ 編輯: tropical72 來自: 180.177.73.222 (04/29 21:35)
吾人非不用 regex, 但以上述的例子而言
字串若為 "字串1 還是字串1\t字串2 還是字串2\t字串3 還是字串3\n"
想抓成三份以 \t 為切割,保留中間之空白,這要怎麼做?
(1) fgets + strchr (2) fgets + strtok
(3) fgets + replace + sscanf
原意與 loveme00835 同,唯考慮我應用到之情況,space 「不要分割」
( 試想如果是 csv file 中間的 space 保留問題 ),以 regex , how to ??
先用 fscanf 再用 strcat ?
parasing 僅為經驗分享而已, 歡迎不吝指教與建議.