ページ 11

文字列を連結する

Posted: 2013年3月08日(金) 22:24
by 三ツ矢

コード:

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 "

Re: 文字列を連結する

Posted: 2013年3月08日(金) 22:57
by softya(ソフト屋)
a[0]を使っていないのは大丈夫ですか?
char *a[256];が文字列操作用のメモリ実体を持っていなくて、strtokでポインタだけ代入しているのでchar input = "I can fly";のメモリ実体を使っています。

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

元のメモリ内容を破壊するので、そうなります。
strtokしたポインタに対して、strlenで長さを調べて+2したサイズでmallocでメモリを割り当てて、strcpyを行なって下さい。
そうすれば後ろに" "をstrcatできます。
割り当てたメモリのfreeを忘れないように。

Re: 文字列を連結する

Posted: 2013年3月08日(金) 23:01
by h2so5
コードにおかしな部分が多いので、参考としてサンプルコードを書いてみました。

コード:

#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;
}