• ベストアンサー

文字の代入とコピーについて

「strcpy(a, b);」 と a=b; とでは何が違うのですか。 「strcpy」は何を目的として使うものなのか、 良くわかっていませんので教えて下さい。

  • burbe
  • お礼率35% (78/221)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

char *a,*b; char buff[10]={ 'a', 'b', 'c', '\0' }; char message[10]= { 'h','e','l','l','o','\0'}; a=buff;b=message; というような時 buff [a][b][c][0][?][?][?][?][?][?] message [h][e][l][l][o][0][?][?][?][?] というような感じでメモリに、文字が格納されています。?は、何が入っているかわからない状態です。 今、 aをbuffの先頭の位置([a])を表す変数として bをmessageの先頭の位置([h])を表す変数とすると a=bとは、 aをmessageの先頭の位置([h])を表すことにすることです。 strcpy(a,b)は、bの示す位置からaの示す位置にその内容を0が出てくるまでコピーする処理をします。 strcpy(a,b)を行うと buff [h][e][l][l][o][0][?][?][?][?] message [h][e][l][l][o][0][?][?][?][?] の状態になります。

その他の回答 (4)

  • jagd-doga
  • ベストアンサー率31% (14/45)
回答No.5

ずばり、No.4さんの解答が正解です。 わかりやすく簡潔にまとめると、 ●strcpy(a,b); bのポインタが示すアドレスからNULL文字までを aのポインタが示すアドレスに書き込む。  ※aが示す先のアドレスに"hello"とNULL文字を   書き込む。 ●a=b bのポインタが示すアドレスを aのポインタに代入する。  ※aもbも同じメモリ領域に書かれている   "hello"を参照する。 ということになります。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

strcpy(a, b)ではcharに入った文字のコピーをするものではありません。 文字の配列、つまり文字列のコピーです。 char a, b; char aa[3], bb[3]; a = 'A'; /* OK */ b = a; /* OK */ strcpy( b, a ); /* NG */ a = "AA"; /* NG */ strcpy( aa, "AA" ); /* OK */ strcpy( bb, aa ); /* OK */

  • mttk1238
  • ベストアンサー率15% (9/59)
回答No.2

こんにちわ。 基本的には、a=bでもstrcpy(a, b)でも文字列のコピー はできますが、a=bの場合、変数bの中身が書き換えら れたら、aの中身も変わってしまいます。 詳しくは下記のサイトを参考にしてもらえばいいと 思います。

参考URL:
http://homepage1.nifty.com/toshio-k/prog/c/string.html
noname#25358
noname#25358
回答No.1

 えとですね。  C言語では、「ポインタ」という考え方が非常に重要になってきます。  ポインタというのは、要するに「表札」のことですね。  たとえば、char *a; という宣言があったとき、その a という変数は、「どこそこに実体がある」という情報だけを持っています。  実際には、実体は a という変数とは全く無関係な領域に独立して確保されているんです。  なので、  a = b;  というのは、その「表札」だけをコピーする命令ということになり、a という変数の実体部分を書き換えると、b と実体を共有しているので、b の実体も書き換わってしまいます。  対し、strcpy(a, b); だと、変数の実体そのものをコピーします。  ゆえに、a の実体を書き換えても、b には影響しません。

関連するQ&A

  • VC++ char[10]へのCString値の代入

    CString a = "ABCDEFGHIJ"; char[10] b; bにaを代入したいのですがstrcpyとか含めて色々(キャストしたり・・・) やってみましたがうまくいきません。 C++初心者でCStringの扱いがうまくできないのです(><) どなたかお助けくださいお願いします。

  • 文字列のコピー

    C言語で、文字列をコピーする関数で、処理が止まってしまいます。 以下が実行したプログラムです。 #include<stdio.h> #include<string.h> void copy(char *str2 ,char *str3){ strcpy(str2,str3); } void input(char* str){ scanf("%s",str); } int main (void){ char *a; char *b="TEST"; printf("%s\n",b); input(a); copy(b,a); printf("%s",b); return(0);} copy(b,a);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。

  • 文字列の扱いについて教えてください

    #include<cstdio> #include<cstring> #define _CRT_SECURE_NO_DEPRECATE 1 #define MAXBUFF 256 void s_swap(char* str_a, char* str_b) { char str_dummy[MAXBUFF]; strcpy_s(str_dummy,strlen(str_dummy),str_a); ★ strcpy_s(str_a,strlen(str_a),str_b); ★ strcpy_s(str_b,strlen(str_b),str_dummy); } void main(void) { char* str_a = "ABC"; char* str_b = "DEF"; int a; printf("呼出前:str_a=%s, str_b=%s\n", str_a, str_b); s_swap(str_a,str_b); printf("呼出後:str_a=%s, str_b=%s\n", str_a, str_b); } str_aとstr_bの中身を入れ替える処理で、エラーや警告はでないのですが ★のところで実行失敗します。 昔から文字列の処理は苦手でどのように攻略したらよいのか 解説していただけないでしょうか。

  • C++言語で、構造体のコピーは可能(しても良い)のでしょうか?

    C++言語で、構造体のコピーは可能(しても良い)のでしょうか? 問題がある場合は、なぜだめなのか知りたいです。 構造体は可変長ではありません。 typedef struct kumi { char namae[10]; int ten; }Kumi; Kumi a, b; strcpy(a.namae, "AAA"); a.ten = 50; b = a;

  • 文字としてではなく/,*,-,+の記号を代入する場合

    /,*,-,+の記号を式として使いたく文字の指定以外で /,*,-,+の記号を代入する場合どの様な形式の入れ物に代入すればいいのでしょうか? ? a = +; int b = 1 a 1; としたいのですがこんな事ができるのでしょうか? 宜しくお願いいたします

  • DirectX9で文字を一文字ずつ表示

    現在、DirectX9の勉強のために簡単なノベルゲームを制作しています。 画像やテキストを表示させたりするといった事は出来たのですが、 ノベルゲームらしくテキストが一文字ずつ流れるように表示させたいのですが、 やり方がわからずに困っています。 自分なりに考えてみたのですが、こんなのしか思い浮かびませんでした・・・。 switch( ( timeGetTime() - nowtimedayo ) / 300 ){ case 3: strcpy(buff,"僕"); break; case 4: strcpy(buff,"僕は"); break; case 5: strcpy(buff,"僕はこ"); break; case 6: strcpy(buff,"僕はここ"); break; case 7: strcpy(buff,"僕はここに"); break; case 8: strcpy(buff,"僕はここにい"); break; case 9: strcpy(buff,"僕はここにいる"); break; } どうか、お力をお貸しいただけないでしょうか・・・。 宜しくお願い致します。

  • 文字列の連結するプログラム

    独学でプログラミングをやっているんですが2つ文字列を1つにする方法がよくわかりません。(1)のプログラムは(b+3)のところは文字の長さを指定しているからだめで(2)はstrcpyやstrcatなどのコマンドを使わずにやるそうです。While分とかでやるんでしょうか?教えてください。 (1) #include <stdio.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; int a,b; spel[6]=0; for(a=0;spel[a]!=0;a++){ spelC[i] = spelA[i]; }; for(b=0;spelB[b]!=0;b++){ spelC[b+3] = spelB[b]; }; printf("%s\n",spelC); return(0); }; (2) #include <stdio.h> #include <string.h> int main (void){ char spelA[] = "abc"; char spelB[] = "def"; char spelC[20]; strcpy(spelC,spelA); strcat(spelC,spelB); printf("%s\n",spelC); return(0); }

  • VBA 同一文字のコピーについて

    B、C列に1つでも済と入っていれば、A列で同じ社名の行をコピーして別シートに貼り付けする。 というマクロを作りたいと思っています。  A  B   C 1 A社 済 2 A社 済 3 A社 4 B社 5 B社 6 C社 7 C社 8 C社    済 9 C社 10 D社 11 D社    済 この場合、1、2、8、11行目に済と入っているので、B社を除く、 1~3行目と、6~11行目をコピーしたいです。 A列で同一文字かどうか分かる方法がわかりませんでした… こういったマクロ出来るでしょうか?? よろしくお願いします

  • Perlで変数に代入された文字の置き換えを行いたい

    Perlで、変数Aに代入された文字を変換し、変数Bに代入するプログラムを作りたいと思っています。 具体的には、「北海道」が変数Aに代入されると、「hokkaido」を変数Bに代入するというものです。 これを47都道府県全体でやりたいと思っています。 プログラムの都合上、 北海道 → 変数A → hokkaido → 変数B という流れで変換する必要があります。 具体的なソースを何卒ご教示いただければ幸いです。 お手数をお掛けいたしますが、アドバイスのほど、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 代入の書き方で質問です。

    $abc = $a - $b + ( $c ); と言うような、カッコを使った記述があるのですが、 + - だけの演算の場合、何か意味があるのでしょうか? #$a、$b、$cはすべて数字です。

    • ベストアンサー
    • PHP

専門家に質問してみよう