- ベストアンサー
文字列から\0を外したい
文字列(わかりやすいように16進で表現します)から\0を外すには どのようにしたらよいでしょうか? 文字列が、61,62,63,64,20,00,67,68,69 とある場合、これを、61,62,63,64,20,67,68,69 としたいのですが、何かいい方法はありませんでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
質問者さん、こんばんは。 > ファイルから読みだして、最終的にファイルに書き込む形になります。 と言うことのようですので、単純にファイル内のNULLコード(=0x00、='\x00')を取り除いて 別ファイルに書込むという処理を行なえばよろしいのでしょうか? その場合、ファイルはテキストファイルではなく、バイナリファイルとして扱った方が楽だと 思います。 そうであれば、以下の過去ログが参考になるかと思います。 ■参考ログ バイナリファイルに含まれているNULLを削除する方法を教えてください。 http://qanda.rakuten.ne.jp/qa4274553.html ・コンソールプログラムでファイルからファイルへ編集して書き出している例です。 ・やっている事は、基本的に質問者さんや他の回答者さんの示されているやり方と同じで、 バッファ内の文字がNULLコードかチェックしてそれ以外をコピーしているものです。 ※ちょっと手前味噌になってしまいますが参考にして頂ければ幸いです。
その他の回答 (6)
- D-Matsu
- ベストアンサー率45% (1080/2394)
元データの長さはどこか別のとこで責任を持つって事でいいですね? ベタですが一番簡単な#1の方向で。 char src[] = {61,62,63,64,20,00,67,68,69}; char *dst; char *src_ptr; char *dst_ptr; int len; // 元データ(src)の長さ ...(lenにsrcの長さを入れる, dstの領域確保など前処理) src_ptr = src; dst_ptr = dst; for (src_ptr = src; src_ptr - src < len; src_ptr ++) { if(*src_ptr != '\0'){ *dst_ptr = *src_ptr; dst_ptr ++; } }
- aris-wiz
- ベストアンサー率38% (96/252)
>文字列が、61,62,63,64,20,00,67,68,69 そもそも C言語での文字列とは\0を終端として持つという 決まりがあります、無視する時点で文字列ではないので、 アクセスできる範囲のサイズを持たせてデータで 管理するか、または複数文字列(ここでは対象のデータ中に \0を超えて文字列であろうものが存在する物を言います)として 扱う方法があります。 通常、C言語の文字列では、「\0」が文字終端となりますが、 複数文字列の終端は「\0\0」となります。 これらを処理する為の関数をつくって、「\0」は消さずに 読み飛ばすのがいいと思いますが、変換した後のデータを 何に使うのか知らないので、なんともいえません。
- asuncion
- ベストアンサー率33% (2127/6289)
対象の文字列は、どこにありますか? 配列ですか?ファイルの中ですか?
補足
ファイルから読みだして、最終的にファイルに書き込む形になります。 つたない知識で色々と考えていった結果、 コピー用の配列を用意して、そこにコピー元から 一文字ずつstrcmpで\0とイコールか見てからコピーし、 イコールの場合、その文字はコピーせずに飛ばす方法にしました。 他に良い方法はありますか?
- Tacosan
- ベストアンサー率23% (3656/15482)
全長を「取得する」のは不可能でしょうから, 別途「長さ」を与えるしかないのでは>#2. そうしないと「文字列」がどこまでかわかりようがない ('\0' を見つけた時に「文字列」の途中かどうかの判断が不可能) ので.
- D-Matsu
- ベストアンサー率45% (1080/2394)
基本的にはNo.1でよいと思いますが、ターゲットが「文字列」だとするとどうやって\0より後ろまで含めた全長を取得するかって問題があるような気がします。
- eicha_2007
- ベストアンサー率14% (23/154)
バッファを用意して,!='\0'の条件で1バイトずつコピーするのではダメですか?
補足
fputs等を用いてファイルに格納する場合、 61,62,63,64,20,00,67,68,69の場合ですと、 61,62,63,64,20となってしまうことから 20と00を区別し、最終的に61,62,63,64,20,67,68,69 として格納する事が目標です。 下記で書きました方法でも動作はしっかり行えて いるのですが、C言語については初歩である事から よりよいプログラムがあればと思って質問させて いただいております。 確かに、別関数というのも手ですね。