【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20457

strcatの使い方
投稿者---青島(2005/03/24 09:13:51)


こんにちは。

strcatの使い方を教えて下さい。
C言語に慣れていないので、いろいろサイトを見ていても
よく解らなくて。

実は、何も格納していないchar配列に文字'A'を格納したい
と考えています。
それで、strcat( tmp, 'A' )としてみましたが
うまくいきません。
使い方が間違っているのでしょうか。

'A'の格納後は、順次'B'、'C'と格納したいと考えています。

御存知の方いらっしゃいませんでしょうか。
宜しくお願い申し上げます。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:strcatの使い方 20458 Blue 2005/03/24 09:29:18
<子記事> Re:strcatの使い方 20459 RiSK 2005/03/24 09:34:05
<子記事> Re2:strcatの使い方 20481 青島 2005/03/25 19:51:01


No.20458

Re:strcatの使い方
投稿者---Blue(2005/03/24 09:29:18)


>それで、strcat( tmp, 'A' )としてみましたが
strcatは格納文字列(tmpにあたるもの)のNULL文字の位置から追加文字列を設定します。
宣言した文字列配列を初期化する必要があります。
それと、第2引き数は文字列型ですので、'A'ではなく"A"とします。
例)
    char tmp[ 64 ] = { 0 };
    strcat( tmp, "A" ); 
    strcat( tmp, "B" );
    strcat( tmp, "C" );

# 開発環境は書きましょう。(OS、コンパイラ等)



この投稿にコメントする

削除パスワード

No.20461

Re:strcatの使い方
投稿者---RiSK(2005/03/24 09:41:44)


> それと、第2引き数は文字列型ですので、'A'ではなく"A"とします。

細かいツッコミ。Cに文字列型は存在しません。


この投稿にコメントする

削除パスワード

No.20462

Re:strcatの使い方
投稿者---Blue(2005/03/24 10:06:42)


>細かいツッコミ。Cに文字列型は存在しません。
指摘ありがとうございます。
文字列ポインタ型ですね。
せっかく赤で強調しても、間違ってるんじゃ。。。orz



この投稿にコメントする

削除パスワード

No.20459

Re:strcatの使い方
投稿者---RiSK(2005/03/24 09:34:05)


>実は、何も格納していないchar配列に文字'A'を格納したい
>と考えています。
>それで、strcat( tmp, 'A' )としてみましたが
>うまくいきません。

どううまくいかないのでしょうか?

>使い方が間違っているのでしょうか。

間違っています。
標準ライブラリ関数のstrcatの仕様を見てください。
文字ではなくて文字列を渡す必要があります。

また文字列を連結するわけですから,tmpに終端'\0'がないと
strcat は暴走します。

>C言語に慣れていないので

とのことですので,安直に答えは出さない方向で。
# って書いたのにもう答えが出てしまってる… orz


この投稿にコメントする

削除パスワード

No.20460

Re:strcatの使い方
投稿者---RiSK(2005/03/24 09:37:16)


補足

strcpy と strcat で文字列を連結させることはできますが,
やたら無理して連発する人がいます。
# 初心者や勉強しない努力家に多い

sprintf でスッキリする場合が多いのでこちらについても
調べることをオススメします。


この投稿にコメントする

削除パスワード

No.20481

Re2:strcatの使い方
投稿者---青島(2005/03/25 19:51:01)


こんにちは。
Blueさん、RiSKさんありがとうございます。

やはり、strcatの使い方が間違っていたみたいです。

>実は、何も格納していないchar配列に文字'A'を格納したい
>と考えています。
実は、別のchar配列testに既にデータが入っていて
そのchar配列testを下のようなfor文でループしています。
for (i = 0 ; i < sizeof(test) ; i++ ){
if ( test[i] == ',' ) j++;
switch (j)
{
case 2:
strcat( data1->code, &(test[i]) );


}
}

(前回tmpと書きましたが、実は構造体のcodeのことです。)

char配列testの中は、"ABC,123,DEF,456"のようになっています。

"DEF"だけ構造体のcodeに入れたいと考えています。

やはり、strcpyを使った後にstrcatを使う方法になるのでしょうか。

すみません。
いま一度教えていただけないでしょうか。


この投稿にコメントする

削除パスワード

No.20487

Re:Re2:strcatの使い方
投稿者---Blue(2005/03/26 00:55:01)


strcatではなく
strncatを使って以下のようにして格納します。

#include <stdio.h>
#include <string.h>

int main( void )
{
    const char   test[] = "ABC,123,DEF,456";
    unsigned int i;
    int          j = 0;
    const char*  p;
    char         code[ 32 ] = "格納した文字は = ";

    for ( i = 0; i < strlen( test ); i++ )
    {
        if ( test[ i ] == ',' )
        {
            switch ( j )
            {
                case 1:
                    /* 2番目の","の次の位置のポインタを設定 */
                    p = &test[ i ] + 1;
                    break;
                case 2:
                    /* 2番目の","と3番目の","の間の文字列を後ろに追加 */
                    strncat( code, p, &test[ i ] - p );
                    break;
            }
            j++;
        }
    }
    puts( code );
    
    return 0;
}




この投稿にコメントする

削除パスワード

No.20488

Re:Re2:strcatの使い方
投稿者---かずま(2005/03/26 01:29:16)


>    for ( i = 0; i < strlen( test ); i++ )

次のように書くのと、どう違うのかを説明できますか?

    for (i = 0; test[i] != '\0' i++)
 


> char配列testの中は、"ABC,123,DEF,456"のようになっています。
> "DEF"だけ構造体のcodeに入れたいと考えています。
> やはり、strcpyを使った後にstrcatを使う方法になるのでしょうか。

strcat を使わずに済ますことも出来ます。

#include <stdio.h>

struct Data { char code[32]; };

int main(void)
{
    char test[] = "ABC,123,DEF,456";
    struct Data data, *data1 = &data;    

    if (sscanf(test, "%*[^,],%*[^,],%31[^,]", data1->code) == 1)
        puts(data1->code);
    else
        puts("ERROR");
    return 0;
}



この投稿にコメントする

削除パスワード

No.20490

Re:Re2:strcatの使い方
投稿者---Blue(2005/03/26 01:40:29)


>>    for ( i = 0; i < strlen( test ); i++ )
>
>次のように書くのと、どう違うのかを説明できますか?
>
>    for (i = 0; test[i] != '\0' i++)

sizeofを安易にstrlenに変えてしまったので、全然気にしていませんでした。
値の変わらないものを何度も取得しにいっているので無駄ですね。
というかstrlenの中身がそのような処理(終端文字までのループ処理)なので、
はなから指摘のとおり書くべきでした。
(以前にも同じ指摘をもらった気がします。。。orz)



この投稿にコメントする

削除パスワード

No.20491

Re:Re2:strcatの使い方
投稿者---青島(2005/03/26 01:42:54)


>for (i = 0; test[i] != '\0' i++)
ヌル文字が現れるまでループするということですか?

if (sscanf(test, "%*[^,],%*[^,],%31[^,]", data1->code) == 1)
puts(data1->code);
else
puts("ERROR");

お恥ずかしながら初学者なもので、全然解りません。
勉強します。


この投稿にコメントする

削除パスワード

No.20492

Re:Re2:strcatの使い方
投稿者---かずま(2005/03/26 01:47:16)


>   for (i = 0; test[i] != '\0' i++)
 
セミコロンが抜けてますね。

   for (i = 0; test[i] != '\0'; i++)


> 次のように書くのと、どう違うのかを説明できますか?

for 文の2番目の式に strlen(test) を書くと、長さの変化しない test に
対して何度も何度も長さを計算させることになってしまいますが、それは
気になりませんかという質問です。



この投稿にコメントする

削除パスワード

No.20489

Re:Re2:strcatの使い方
投稿者---青島(2005/03/26 01:34:41)


>strncatを使って以下のようにして格納します。

勉強のために、すみません、教えてください。
strcpyやstrcatを使った場合、どのようになるのでしょうか。

質問ばかりで申し訳ございません。





この投稿にコメントする

削除パスワード

No.20493

Re:Re2:strcatの使い方
投稿者---Blue(2005/03/26 02:31:59)


#include <stdio.h>
#include <string.h>

int main( void )
{
    const char   test[] = "ABC,123,DEF,456";
    unsigned int i;
    int          j = 0;
    const char*  p;
    char         code[ 32 ] = "格納した文字は = ";
    char         strcpycode[ 32 ], strcatcode[ 32 ], strncpycode[ 32 ], strncatcode[ 32 ];
    int          nlen = strlen( code );

    strcpy( strcpycode, code ); strcpy( strcatcode, code ); strcpy( strncpycode, code ); strcpy( strncatcode, code );

    for ( i = 0; test[ i ] != '\0'; i++ )
    {
        if ( test[ i ] == ',' )
        {
            switch ( j )
            {
                case 1:
                    p = &test[ i ] + 1;

                    strcpy( strcpycode + nlen, p );

                    strcat( strcatcode, p );
                    break;
                case 2:
                    strcpycode[ nlen + ( &test[ i ] - p ) ] = '\0';
                    strcatcode[ nlen + ( &test[ i ] - p ) ] = '\0';

                    strncpy( strncpycode + nlen, p, &test[ i ] - p );
                    strncpycode[ nlen + ( &test[ i ] - p ) ] = '\0';

                    strncat( strncatcode, p, &test[ i ] - p );
                    break;
            }
            j++;
        }
    }
    printf( "strcpy  : %s\n", strcpycode );
    printf( "strcat  : %s\n", strcatcode );
    printf( "strncpy : %s\n", strncpycode );
    printf( "strncat : %s\n", strncatcode );
    
    return 0;
}


今回は 文字列にある文字列中の指定範囲の文字列を追加するということで
strncatが最適であると思います。

# かずまさんのsscanfの方法以外に strtok を使ったやり方もあります。
# (strtokは自分で考えて見ましょう。)




この投稿にコメントする

削除パスワード

No.20494

Re:Re2:strcatの使い方
投稿者---Blue(2005/03/26 02:43:10)


>"DEF"だけ構造体のcodeに入れたいと考えています。
となってました。文字追加ではなかったですね。
(strcat を強調されていたのでてっきり文字追加だと思ってしまいました。)

ってことはcodeの文字列長なんて気にせずstrncpy(上書きコピー)して終端文字を設定するのが一番最適なのかな?

# sscanfやstrtokはなんか遅そう。。。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧