フォーマット動的生成を出発直前にほぼ完成させる。
これ結構有用性高いと思うのでコピペ&宣伝。
TCHAR buf[128], format[64]; TCHAR item[10][16]; // scanfの読み込み先 int iCount = 10, ptr = 0, com = 0; // scanfで取る要素の数、文字列連結用、コンマの数 for(int i = 0; i < sizeof(buf) && com < iCount; i++) { if(buf[i] != L',') continue; if(i > 0 && buf[i - 1] != L',') { ptr += wsprintf(format + ptr, L"%%[^,],"); // nullflag[com] = true; } else { ptr += wsprintf(format + ptr, L"%%1[,]"); // nullflag[com] = false; } com++; } ptr += wsprintf(format + ptr, L"\0"); _stscanf_s(buf, format, item[0], 16, item[1], 16, item[2], 16, item[3], 16, item[4], 16, item[5], 16, item[6], 16, item[7], 16, item[8], 16, item[9], 16);
空文字列は","の値を取り、それ以外はカンマを含まない文字列を取ります。
この処理の後にitemをチェックし空文字列に置き換えていけばOK。
nullflagはそのチェック用にあったものだけど、上記の方法のが直感的にわかりやすいかと思いコメントアウト。
置き換えなくてもそのまま条件式に突っ込めるのでやることによっては楽になるかも。
どっちがtrueでどっちがfalseか決めかねるのも理由だったりして。
デリミタを複数指定してたりすると文字列関数を使う必要が出てきたりしますね。とりあえずこれはCSV用ってことで。
追記:forの条件式が文法的に間違っていたのを修正。eldeshさんありがとうございます。