文字列を連結する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
三ツ矢

文字列を連結する

#1

投稿記事 by 三ツ矢 » 13年前

コード:

char *a[256];
char input = "I can fly";

 a[1] = strtok( input, " " );
    for( i = 2; a[i - 1] != NULL; i++ ) {
        a[i] = strtok( NULL, " " );
      
        if( a[i] == NULL )break;  
    }


上のコードで実行ファイルを動かすと
a[1]→"I"
a[2]→"can"
a[3]→"fly"
が格納されたのですが,
各項目の後に半角空白文字を入れたいのですが方法がわかりません.

iをループで回したとして,
i=1のとき,
strcat(a, " ");
をすると(当然ですが)a[2]の"can"が消え,何もない状態になってしまいます.

各配列の中身は次のようにしたいと考えています.
どう記述すれば次のようにできるでしょうか.
a[1]→"I "
a[2]→"can "
a[3]→"fly "

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 文字列を連結する

#2

投稿記事 by softya(ソフト屋) » 13年前

a[0]を使っていないのは大丈夫ですか?
char *a[256];が文字列操作用のメモリ実体を持っていなくて、strtokでポインタだけ代入しているのでchar input = "I can fly";のメモリ実体を使っています。

>strcat(a, " ");
>をすると(当然ですが)a[2]の"can"が消え,何もない状態になってしまいます.

元のメモリ内容を破壊するので、そうなります。
strtokしたポインタに対して、strlenで長さを調べて+2したサイズでmallocでメモリを割り当てて、strcpyを行なって下さい。
そうすれば後ろに" "をstrcatできます。
割り当てたメモリのfreeを忘れないように。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 文字列を連結する

#3

投稿記事 by h2so5 » 13年前

コードにおかしな部分が多いので、参考としてサンプルコードを書いてみました。

コード:

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

void copyToken( char *dst, const char *token ) {
    strcpy( dst, token );
    strcat( dst, " " );
}

int main() {
    
    char a[256][256];
    char input[] = "I can fly";
    const char *token;
    int i = 0, j = 0;
    
    token = strtok( input, " " );
    if ( token != NULL ) {
        copyToken( a[0], token );
    }
    
    while( ++i, ( token = strtok( NULL, " " ) ) != NULL ) {
        copyToken( a[i], token );
    }
    
    for ( j = 0; j < i; ++j ) {
        printf( "'%s'\n", a[j] );
    }
    
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る