Re: [問題] sscanf的奇怪問題@@?
恕刪
推
04/29 13:53,
04/29 13:53
推
04/29 13:57,
04/29 13:57
推
04/29 14:25,
04/29 14:25
推
04/29 14:35,
04/29 14:35
推
04/29 20:53,
04/29 20:53
→
04/29 20:53,
04/29 20:53
→
04/29 20:54,
04/29 20:54
→
04/29 20:55,
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 回來,輸出結果「看」起來正常.
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.222
※ 編輯: tropical72 來自: 180.177.73.222 (04/29 21:35)
推
04/29 21:54, , 1F
04/29 21:54, 1F
推
04/30 12:41, , 2F
04/30 12:41, 2F
推
04/30 15:13, , 3F
04/30 15:13, 3F
→
04/30 15:18, , 4F
04/30 15:18, 4F
→
04/30 15:19, , 5F
04/30 15:19, 5F
→
04/30 15:36, , 6F
04/30 15:36, 6F
→
04/30 15:37, , 7F
04/30 15:37, 7F
推
04/30 15:42, , 8F
04/30 15:42, 8F
→
04/30 15:43, , 9F
04/30 15:43, 9F
→
04/30 15:43, , 10F
04/30 15:43, 10F
推
04/30 15:47, , 11F
04/30 15:47, 11F
→
04/30 15:47, , 12F
04/30 15:47, 12F
→
04/30 15:48, , 13F
04/30 15:48, 13F
推
04/30 15:50, , 14F
04/30 15:50, 14F
→
04/30 15:51, , 15F
04/30 15:51, 15F
吾人非不用 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 僅為經驗分享而已, 歡迎不吝指教與建議.
推
04/30 16:21, , 16F
04/30 16:21, 16F
錯字已修正, 謝謝指正
推
04/30 16:21, , 17F
04/30 16:21, 17F
※ 編輯: tropical72 來自: 180.177.73.222 (04/30 16:24)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章