- ベストアンサー
文字列についていい方法はありますか?
マイコンでプログラムを作っています。 配列aに文字を入力し、それを7セグに表示したいです。 表示自体は出来ています。 なので、文字列を配列に入力する方法を教えてください。 (数字以外を表示します。) まず、現在は char *a[6]; a[0]="12345"; seg(*a);//7セグ表示用関数 このようなソースを書きました。これは希望通りの動作してます。 しかし、例えば a[0] = "12"; a[2] = "345"; や、 a[0] = "12" + "345" のように、文字列どうしをくっつけるような使い方が出来ないものかと悩んでいます。 最悪の場合 char a[5]; a[0] = '1'; a[1] = '2'; a[2] = '3'; a[3] = '4'; a[4] = '5'; と、このような方法を使おうと思ってますが、あまり好きじゃないです。 出来ないのは無知なせいなのか、方法は有るが最後の方法が一番マシなのか、もっといい方法があるなら何を使えばいいのか、等アドバイスをお願いします。 よろしくお願いします。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
#4,#5です。とりとめなくいろいろ書きます。 > その危険と言うのが > strcpy( a, "1234567" ); > となる事があるようにプログラムを書いてしまった時のみの危険なのか、 こっちです。 文字数が分かっているのならstrcpyよりもmemcpyを使用した方が速いかも しれません。 > memcpy( a, "12345", 5 ); 一般的にライブラリ関数は、エラーチェック等のさまざまなオーバヘッドが 含まれるものなので、 スピードを気にするならエラーチェック無しの自作のシンプルな代替関数を 作って速度比較すると良いかもしれません。 #2さん回答のお礼部分を見ると、 「char a[ 6 ];」と「char *a[ 6 ];」の違いが分かっていないような気がします。 二者は明らかにデータ構造が違います。 > 俺も良く分からないんですが、例えば > a[0] = "12"; > a[2] = "345"; > printf("%s",*a); > とやると実行結果は > 12 > となってしまい、345が表示されません。 > > マイコンの場合は > 12??? > と、?の部分には何が入るか分からないような状態になってしまいます。(とりあえず今やったの > でした。) > > たぶんですが、a[0]に"12"のアドレスを渡しただけなので、seg()が受け取った配列にはa[0]の先 > スから5文字分が入力されていて、"345"が行方不明になってるんじゃないかと思います。 これは「char *a[6];」の場合で、「printf( "%s", a[2] );」とすると"345"が表示されると思います。 a[0] → "12" a[1] → 不明 a[2] → "345" a[3] → 不明 a[4] → 不明 a[5] → 不明 です。 やはり意図しているのは、「char a[6];」のほうで、 a[0] → '1' a[1] → '2' a[2] → '3' a[3] → '4' a[4] → '5' a[5] → '\0' こういう構造を望んでいるんじゃないかという気がします。
その他の回答 (11)
- php504
- ベストアンサー率42% (926/2160)
とりあえず最悪の場合のケースは char a[5]; strcpy(a, "1234"); でできます。 文字列の結合は char *strcat(char *dest, const char *src); を使います。
お礼
ありがとうございます。 やってみます。
補足
strcpyとstrcatを使えばやりたい事が出来ました。 ただ、普通に a[0] = '1'; a[1] = '2'; a[2] = '3'; a[3] = '4'; a[4] = '5'; とした時に比べて10~16倍ぐらい遅い処理なので、ちょっと悩んでます。(今はこれで問題ないのですが、後々時間が問題になるような場所に使う事があるかもしれないので) ありがとうございました。
- 1
- 2
お礼
ありがとうございます。 memcpyを使えばやりたい事が出来ました。 速度もstrcpyとstrcatに比べるとかなり速いのでこれで行こうと思います。 memcpy(a,"12345",5);//9クロック memcpy(&a[0],"1",1);memcpy(&a[1],"234",3);memcpy(&a[4],"5",1);//25クロック strcpy(a,"1");//32クロック strcat(a,"2");//62クロック >「char a[ 6 ];」と「char *a[ 6 ];」の違いが分かっていないような気がします。 違いが分かっていませんでした。 と言う事は、「char *a[6];」でやってた事は「char *a;」でも同じ動作をしてたと言う事ですね。