• ベストアンサー

文字のコピー

文字配列s[256],t[256]を用意して文字列を入力し、配列sに格納し、その後に配列s の内容を配列t にコピーするプログラムというものなんですが・・・・二つの文字型ポインタp,q で定義し,p = s,q = t として,変数p,q のみを利用してコピーします。 #include <stdio.h> int main ( void ){ char s[256]; char t[256]; char *p; char *q; printf("文字列を入力:"); scanf("%s", s ); p = s; q = t; while(*p != '\0'){ p++; q++; *q = *p; } p = '\0'; printf("文字列は%s",t); getchar(); getchar(); return(0); } ビジュアルスタジオつかってます。 しかしこのように記述するとなぜか最初の文字をよみこんでくれません。 たとえば yasuhiroとすると フasuhiroと出力してしまうのですが なにかいい解決方法はありませんか??

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

  • ベストアンサー
  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

先にインクリメントしているからじゃないですか?

melthig
質問者

補足

while(*p != '\0'){ *q = *p; p++; q++; } ということですか? これでもだめなんですが・・・

その他の回答 (1)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

> p = '\0'; これは、まずいのでは? pじゃなくてqでしょうし、「*」も無い・・・

関連するQ&A

  • 文字を反転させる。

    以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) キーボードから文字列を入力し,文字配列s[64] に格納する. (2) 文字配列s[64] に格納されている文字列を逆順にしてt[64] に格納する(配列全部を逆 順にするのではなく,NULL 文字までの要素を逆順にする). (3) t[64] を画面表示する. ポインタ使用不可、ヘッダファイル<stdio.h>だけ 入力された文字を反転させるということでしょうか?? #include <stdio.h> int main(void){ int i; char s[256]; char t[256]; printf("文字列を入力:"); scanf("%s" , s); for ( i = 0; i < '\n'; i++ ){ t[i] = s[i]; } printf("文字列の逆順は%s",t); getchar(); getchar(); return(0); } これだとただ入力された文字を出力するだけになってしまいますよね・・・・。どうすればいいのでしょうか?

  • 上からよんでも下から読んでも同じか?否か?

    以下のプログラムは入力された文字をポインタを使ってpalindromeにコピーしたやつなんですが #include <stdio.h> int main ( void ){ char origin[256]; char palindrome[256]; char *p; char *q; int length = 0; printf("文字列を入力→"); scanf("%s",origin); p = origin; q = palindrome; while(*p != '\0'){ *q = *p; p++; q++; length++; } *q = '\0'; printf("length = %d\n", length); printf("入力された文字:%s",palindrome); getchar(); getchar(); return(0); } これをポインタを使って上から読んでも下から読んでも同じ(いわゆるかいぶんってやつ?)なら1を、違ったら0を返すというプログラムを組みたい場合に文字配列,及び文字配列長を引数とする関数check_anagram を使用してどのように表せるのでしょうか? とりあえずヘッダは<stdio.h>のみでできるようにしたいのですが・・・・ lengthを関数内で使ってfor文で処理? そこら辺の組み方がわからないです。

  • 末尾にコピーするプログラム

    大学で 「main関数でキーボードからの2つの文字数を受け取り、関数を実装し仮引数に文字列s1、文字列s2をとり、s2をs1末尾にコピー(s1とs2を連結)するプログラミングを作成しなさい」 void cat(char *s1,char *s2) という問題がありました。以下、その回答を考えたのですがこれで大丈夫ですか? #include <stdio.h> void cat(char *s1, char *s2); void main(void); void cat(char *s1, char *s2) { while ((*s1++ = *s2++) != '\0') ; } void main(void) { char s1[100]; char s2[100]; printf("一つ目の文字列を入力してください。:",s1); scanf("%s",s1); printf("二つ目の文字列を入力してください。:",s2); scanf("%s",s2); cat(s1, s2); printf("コピー後: = %s\n", s2); }

  • 文字列の読み込みに関して

    char ch[100]; printf("文字列を入力を入力してください。\n"); scanf("%s",&ch); printf("あなたは%sと入力しましたね。\n",ch); ここでいう&chとは配列全体を指すポインタ それに対して Scanf(“%s”,ch); であるchは配列&ch[0]であり配列chの先頭要素を指すポインタである。 どちらの場合でも表示は同じになります。 ですが、上記の方が間違いであるとするならばうまくいかない 場合はどういうときなのでしょうか? 上記の方は配列全体を指すポインタということですがいまいち イメージがわかないです。

  • 文字列の検索と比較

    文字列の検索と比較 以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) 文字配列name[5][64] を作成する. (2) キーボードから5 人分の名前を入力し,name 配列に格納する. (3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 する.ただし,見つからなかった場合には,「見つかりません」と表示する. (4) 「quit」が入力されるまで(3)の処理を繰り返す. という処理です・・・・・。 #include <stdio.h> int main(void){ char name[5][36]; int i; for(i = 0; i < 5; i++ ){ printf("%d番目の名前を入力:", i + 1); scanf("%s", name[i] ); } printf("五人の名前を入力しました。\n"); printf("どこに格納されているか検索します。名前を入力:"); scanf("%s",name); /* ここに配列の何番目に格納されているかを検索して表示するプログラムを作成する ただし,見つからなかった場合には,「見つかりません」と表示する. 「quit」が入力されるまで処理を繰り返す処理を書く?? */ getchar(); getchar(); return(0); } 検索された文字と入力された文字が同じであることの処理はどうすればいいのでしょうか? 二つの配列を用意してループ文?でしょうか?

  • 文字列のコピー

    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);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。

  • 文字列を表すための配列とポインタ

    文字列を表すための配列とポインタ  配列とポインタは同様に扱えるもの、と思って、次のプログラムを作りました。処理系は、Visual Studio 2010 コマンドプロンプトです。 #include <stdio.h> void main(void) { char a[256]; char *b; printf("文字列を入力してください。\n"); printf("例「abcde」\n\n"); printf("配列型文字列を使います。\n"); scanf("%s", a); printf("文字列は%sです。\n\n", a); printf("ポインタ型文字列を使います。\n"); scanf("%s", b); printf("文字列は%sです。\n", b); }  すると、まずコンパイル時に、 「warning C4700: 初期化されていないローカル変数'b'が使用されます」 と表示されました。そして、実行すると、「配列型文字列」の方は問題ないのですが、「ポインタ型文字列」の方の実行後に、 「x.exeは動作を停止しました。 問題が発生したため、プログラムが正しく動作しなくなりま した。プログラムは閉じられ、解決策がある場合は Windowsから通知されます。」 と表示され、エラーとして終了してしまいます。 「char *b;」 と宣言するところが問題のようですが、なぜなのかが分かりません。どなたか、解説をお願いします。

  • 入力文字と配列がわからない><

    文字列と配列がよくわかりません・・・。 以下のプログラムで「おく」と入力すると ・ ィ と表示されます・・・。 何がおかしいのでしょうか; int main(){   char a[4];   scanf("%s", a);   printf("a[0] = %c \na[1] = %c \n", a[0], a[1]); }

  • 関数の作り方

    文字列s1に文字列s2が含まれるか判定する関数search を作りたいのですが、コンパイルできません。 どこに問題がありますか?? #include<stdio.h> #include<string.h> int seach(char *s1,char *s2) { char *p; p = strstr(s1,s2); if(p == NULL){ return 0; }else{ return 1; } } main(void){ char s1[255]; char s2[255]; int res; printf("文字列s1を入力:"); scanf("%s",s1); printf("文字列s2を入力:"); scanf("%s",s2); res = search(s1,s2); if(res == 1){ printf("文字列s1に文字列s2が含まれます\n"); } if(res == 0){ printf("文字列s1に文字列f2は含まれません\n"); } return 0; }

  • 文字列の入れ替え

    2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作成せよ。ただし入替え処理には、関数swap_array(char [],char [])を作成して用いること。という問題なのですが、下記の実行例では、2つの文字列xとyをキーボードから入力し、入れ替えた後に表示している。 <実行例> % ./irekae 文字列x (20字まで)? Mojiretsu 文字列y (20字まで)? Irekae 関数swap_array()を呼び出しました 入替後の x: "Irekae" 入替後の y: "Mojiretsu" % となっているのですが文字列を格納するところまでしかわかりません。 どなたか教えていただけないでしょうか? #include<stdio.h> int main(void) { char x[21]; char y[21]; printf("文字列 (20字まで)? "); scanf("%s", x); printf("文字列 (20字まで)? "); scanf("%s", y);

専門家に質問してみよう