- ベストアンサー
Cで部分配列
はじめまして。 Cでテキストファイルに羅列されたデータを取得して計算したいのですが、データの処理方法に困っています。 その準備として教えていただきたいのですが、 例えば、一文をscanfで読み込み(例えばabcdefghijk)、 3文字目から5文字目を抽出して出力する(上の例ならcde) ような方法をご教授お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
★いろいろな方法があります。 (1)『strncpy』関数を使う→ここの回答者 No.4 さん参照(下のリンクの回答者 No.2、No.3、No.5) (2)『wcsncpy』関数を使う→下のリンクの回答者 No.5 参照 (3)『strndup』関数を使う→下のリンクの回答者 No.4 参照 (4)VBA などと等価な MID 関数を自作する→下のリンクの回答者 No.6 参照 (5)printf、sprintf の書式制御文字列『%.3s』を使う→ここの回答者 No.3 さん参照 ・上記以外にも工夫次第でいろいろな方法で実現できそうです。 とにかく文字列の [2]、[3]、[4] の要素を別領域にコピーすればよいのです。 下にサンプルを複数載せますので参考にして下さい。 サンプル1:仕組み char buf[ 256 ] = "abcdefghijk"; ←scanf で読み込んだバッファ char mid[ 32 ]; ←抽出用バッファ mid[ 0 ] = buf[ 2 ]; mid[ 1 ] = buf[ 3 ]; mid[ 2 ] = buf[ 4 ]; mid[ 3 ] = '\0'; サンプル2:添え字コピー char buf[ 256 ] = "abcdefghijk"; char mid[ 32 ]; int i; for ( i = 0 ; i < 3 ; i++ ){ mid[ i ] = buf[ i + 2 ]; } mid[ i ] = '\0'; サンプル3:ポインタでコピー char *pbuf, buf[ 256 ] = "abcdefghijk"; char *pmid, mid[ 32 ]; int i; pbuf = &buf[ 2 ]; pmid = &mid[ 0 ]; ←『pmid = mid;』でも良い。 for ( i = 0 ; i < 3 ; i++ ){ *mid++ = *pbuf++; } *pmid = '\0'; サンプル4:sprintf使用 char buf[ 256 ] = "abcdefghijk"; char mid[ 32 ]; sprintf( mid, "%.3s", (buf + 2) ); printf( "mid = [%s]\n", mid ); ←出力して見る サンプル5:memset、memcpy使用 char buf[ 256 ] = "abcdefghijk"; char mid[ 32 ]; memset( mid, &mid[0], 0 ); memcpy( mid, &buf[2], 3 ); 最後に: ・過去に似たような質問がありましたよ。 ・http://oshiete1.goo.ne.jp/qa2744534.html→『エクセルのMID関数は、C言語では?』 ・回答者 No.6 として VBA などのMID関数と等価な『MyStrMid』関数を紹介しています。 こちらの質問にも多数の回答があるので参考質問として読んで見て下さい。 ・以上。おわり。
その他の回答 (5)
- don_go
- ベストアンサー率31% (336/1059)
printf(), sprintf() の書式制御文字を使う場合は "%3s" ではなく"%.3s" です。念のため... "."がポイント!!
お礼
ご回答ありがとうございました。 今回この方法を知ったことも勉強になりました。
- ibe_tattsu
- ベストアンサー率70% (36/51)
char buf[256]という変数に一文が格納されているとして、 char buf2[256]に格納するとします。 strncpy(buf2, &buf[2], 3); buf2[3] = '\0'; ちなみに、一文の内容は少なくとも2文字以上でないとうまくいきません。 1文字以下の場合があるならば、文字数チェックの処理も付けてください。
お礼
この方法が一番分かりやすく、実践しやすかったのでこれでやっていきたいと思います。ありがとうございました。
- don_go
- ベストアンサー率31% (336/1059)
printf("%.3s", &buf[2]);
お礼
ご回答ありがとうございます。 このような方法があったとは知らず、言葉足りずになってしまいましたが、 今回はprintfで表示するのが目的ではなく、抜き出したものを扱いたかったのですが、大変勉強になりました。
- amazontester
- ベストアンサー率22% (11/48)
abcdefghijkという一文を char str[256]; ファイル入出力関数を利用して上の変数に読み込んだと仮定します。 char buf[256]; という変数を用意して for ( int i = 0, j = 0; i < sizeof(str); i++ ) { if ( 3 <= i && i <= 5 ) { buf[j] = str[i]; j++; } } と言う風に書けば実現できます。
- matsuhira
- ベストアンサー率17% (15/85)
scanfで取得した文字を配列に代入して、For文を使って3文字目から 5文字目までを変数を使って繰り返して、指定された配列をprintfで抽出してみてはどうでしょうか?
お礼
早速のご回答ありがとうございます。 試してみたいと思います。
お礼
いくつものサンプルを提案していただき、ありがとうございます。勉強にさせていただきます。