C言語関係掲示板

過去ログ

No.150.char型の配列(一部)のコピー


No.970

char型の配列(一部)のコピーの仕方。
投稿者---ひよこ(2002/01/28 21:35:52)


char型の配列のコピーの仕方についての質問です。
全てではなく一部のみコピーしたい場合はどうするのでしょうか??
例えばchar A[100]からchar B[4]へchar Aの上から順にコピーをしたいのです。

memset( B, NULL, sizeof(B));
strcat(B, A[i]); //→これは文字列連結の関数なので無理??
strcat(B, A[i+1]);
strcat(B, A[i+2]);
strcat(B, A[i+3]); // 最後にヌル文字を入れる。

どうぞ宜しくお願いいたします。




No.971

訂正です。
投稿者---ひよこ(2002/01/28 21:45:16)


> strcat(B, A[i+3]); // 最後にヌル文字を入れる。

→最後にヌル文字が入り(初期化している為)
 一文字完成する、の間違いです。

No.973

Re:訂正です。
投稿者---素人(2002/01/29 09:30:12)


はじめまして。
掲題の件ですが、
strncpy関数を使用したらいかがでしょうか?
A[100]から3バイトをBにコピーしたいのなら

strncpy(B,A,3)とすれば文字列Aから3バイトをBにコピーします。
もし、文字列の途中(A[50]など)からコピーしたいのならば
strncpy(B,&A[50],3)とすればいいと思います。
ちなみに、ひよこさんがあげた、
strcat(B, A[i]); も
strcat(B, &A[i]); とすれば問題ないと思います。

あと考えられるのは、配列に1つずつ格納していく方法です。
きっと他にもいい方法はあるとは思いますが
素人の私が思い浮かんだのはこのくらいでした。

ひよこさんの参考になれば幸いです。


No.974

ありがとうございま〜す!
投稿者---ひよこ(2002/01/29 09:39:15)


ありがとうございました。この関数は初めて知りました。
すごく便利ですね。
助かりました。早速使ってみます。
またよろしくお願いします。

No.983

その後また質問です。。
投稿者---ひよこ(2002/01/29 18:41:24)


教えていただいたstrncpyではうまくいきました。
その後、ループでまわしたいときは、
for (i=0; i<sizeof(A); i+=3){
strncpy( B, &A[i], 3); /* 最後にヌル文字がついたASCII1文字完成 */
}
ではだめなのでしょうか??
うまくいかないのですが。。

しかし、strcat()でやると
for (i=0; i<sizeof(B); i=i+4){
strcat(B, &A[i]);
strcat(B, &A[i+1]); // なぜかここでBには膨大なデータが移っている。
strcat(B, &A[i+2]);
BにはAのデータが全て入ってしまうようです。
(→デバッグ画面にて見たところ)
A[i]のアドレスをBにコピーということは、一旦全部格納されてしまうのでしょうか?
しかし、B の大きさ以上格納されるという事はありえないですよね?
デバック画面がそうであったので頭が混乱しております。。。
どうぞお分かりでしたら、教えていただきたいです。
宜しくおねがいします。

No.988

Re:その後また質問です。。
投稿者---B.Smith(2002/01/29 21:28:49)


文字列操作関数は、末尾にヌルがついている文字列を処理するように出来ています。基本的に一文字単位の処理は呼び出し側で工夫しなければなりません。

例えば、Aに"ABCDEFGHIJKL"が格納されていて、Bにはヌルが格納されているとします。
    for (i=0; i<sizeof(B); i=i+4){
      strcat(B, &A[i]); 
      strcat(B, &A[i+1]); // なぜかここでBには膨大なデータが移っている。
      strcat(B, &A[i+2]);

この処理では、1回目のループで、
,"ABCDEFGHIJKL"をBに追加
△"BCDEFGHIJKL"をBに追加
で"CDEFGHIJKL"をBに追加

という結果になってしまい、Bには最初のループだけで"ABCDEFGHIJKLBCDEFGHIJKLCDEFGHIJKL"という文字列が格納されてしまいます。

連続した文字をコピーしたい場合は、ループする必要はありません。例えば3つ目の要素から連続して3文字コピーしたい場合は、
    strncpy(B,&A[2],3);   または
    strncpy(B,A + 2,3);

これで十分です。この場合は"CDE"が格納されます。
strncpyは特定条件でヌル文字の付加を行います(No.978またはライブラリリファレンスを参照してください)。

例えば、Aの内容を3文字毎にコピーし、それを使って処理を行いたい場合は、
    for (i = 0; i < strlen(A); i += 3){
        strncpy(B, A + i, 3);
        (Bを使った処理)
    }

となります。&A[i]という表現は可能ですが、ポインタに慣れる、という意味からあまりお勧めできません。しかし、この表現を否定するわけではありませんので、徐々に慣らして行ってください。

No.973で素人さんが言われている「配列に一つずつコピー」も一つの手です。
例1.
    int    Idx;

    for(Idx = 0;Idx < 3;Idx++)
        B[Idx] = A[Idx];

    B[Idx] = 0;

例2.
    B[0] = A[0]; B[1] = A[1]; B[2] = A[2]; B[3] = 0;

コピーする文字が少ない場合は、こちらの方をお勧めします。


No.990

よく理解することができました。
投稿者---ひよこ(2002/01/30 09:49:27)


いつもどうもありがとうございます。
とてもすっきりいたしました。
Cを勉強して数ヶ月経つのですが、未だに標準関数の
使い方がよく分かっておりません。
またひとつ成長しました!
分かりやすいご説明、ありがとうございました!

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.16
Copyright(c) 2000-2002 TOMOJI All Rights Reserved