掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.27110

文字列とポインタについて
投稿者---samurai(2006/06/08 16:11:47)


実行はできたのですがstrcpy(&printForBuffer[4],pStringMyName);の
&printForBuffer[4]がなぜ[4]なのがわかりません。
教えてくださいお願いします。

#include"stdio.h"
#include <string.h>
/****************************************/
/*演算プログラム
/****************************************/
int main(int argc,char*argv[])
{
    /*charのポインターに文字列をセット*/
    char *pStringlam="私は";
    char *pStringMyName="山田です。";

    /*表示用の編集バファ*/
    char printForBuffer[256];
    strcpy(printForBuffer,pStringlam);
    strcpy(&printForBuffer[4],pStringMyName);

    /*表示する*/
    printf(printForBuffer);

    return(0);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列とポインタについて 27111 Blue 2006/06/08 16:16:03
<子記事> Re:文字列とポインタについて 27118 shu 2006/06/08 17:37:09


No.27111

Re:文字列とポインタについて
投稿者---Blue(2006/06/08 16:16:03)


>strcpy(printForBuffer,pStringlam);

"私は"という文字がprintForBufferに格納されます。
ここで、&printForBuffer[4]としないと、
格納した"私は"という文字列が上書きされてしまいます。

ちなみに
>strcpy(printForBuffer,pStringlam);

strcpy(&printForBuffer[0],pStringlam);
と同じです。先頭から格納するということになります。


また、文字列を結合するならば、strcpyよりもstrcmpの方が向いています。
strcpy(printForBuffer,pStringlam);
strcmp(printForBuffer,pStringMyName);



この投稿にコメントする

削除パスワード

No.27112

Re:文字列とポインタについて
投稿者---samurai(2006/06/08 16:37:57)


お返事ありがとうございます。
はじめはprintForBuffer[3]だと思ったのですが間違いでした。
なぜprintForBuffer[4]なのでしょうか?



この投稿にコメントする

削除パスワード

No.27113

Re:文字列とポインタについて
投稿者---Blue(2006/06/08 16:45:26)


char printForBuffer[256];
と宣言することで、256文字文の領域が取られます。
イメージ)
   0   1   2   3   4   5   6   7   8
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─
│ │ │ │ │ │ │ │ │ │ ・・・
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─
※初期化していないので、何が入っているかは不定です。

strcpy(printForBuffer,pStringlam);
で
イメージ)
   0   1   2   3   4   5   6   7   8
┌───┬───┬─┬─┬─┬─┬─┬─
│  私  │ は  │\0│ │ │ │ │  ・・・
└───┴───┴─┴─┴─┴─┴─┴─
※日本語は2バイト文字とします。
というように文字列が格納されます。

ということは、続きは &printForBuffer[4]からになります。



この投稿にコメントする

削除パスワード

No.27115

Re:文字列とポインタについて
投稿者---samurai(2006/06/08 16:52:35)


ご丁寧にありがとうございました。日本語文字が1文字2バイトだという
ことを忘れて1バイトだと勘違いしていました。解決できました!


この投稿にコメントする

削除パスワード

No.27116

Re:文字列とポインタについて
投稿者---Blue(2006/06/08 16:53:48)


> printForBuffer[4]
というように 数字で固定せずに、strlen関数を使ってあげるのが汎用的でしょう。
(そうすれば、今回のような勘違いはなくなると思います。)

strcpy( printForBuffer, pStringlam );
strcpy( &printForBuffer[ strlen( printForBuffer ) ], pStringMyName );// 格納された文字列の次の領域にコピー



この投稿にコメントする

削除パスワード

No.27117

Re:文字列とポインタについて
投稿者---shu(2006/06/08 17:32:11)


>また、文字列を結合するならば、strcpyよりもstrcmpの方が向いています。
>strcpy(printForBuffer,pStringlam);
>strcmp(printForBuffer,pStringMyName);

strcmp()ではなくて、strcat()との勘違いと思われます。

strcpy(buf, str1);
strcat(buf, str2);
puts(buf);



この投稿にコメントする

削除パスワード

No.27119

Re:文字列とポインタについて
投稿者---Blue(2006/06/08 17:42:34)


>strcmp()ではなくて、strcat()との勘違いと思われます。
本当ですね。何ぼけているんでしょうかね。。。orz

ご指摘ありがとうございました。



この投稿にコメントする

削除パスワード

No.27118

Re:文字列とポインタについて
投稿者---shu(2006/06/08 17:37:09)


#include"stdio.h" というのが変。
「演算プログラム」というコメントが(現時点では)おかしい。
「charのポインターに文字列をセット」というコメントが不適切。



この投稿にコメントする

削除パスワード

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