• ベストアンサー

副プログラム内(void mystery(char s1[],char s2[]))の動作確認文 

お忙しい中失礼します。 下記のプログラム内の動作について質問があります。宜しければご回答願います。 void mystery(char s1[],char s2[]) { int i=0; while(s2[i]!='\0'){ //s2[i]内に文字が入力され、エンターキーが入力されるまで{s1[i] = s2[i]; ++i;}内の動作を行う。 s1[i] = s2[i];    //s1[i] を基準にs2[i]の文字数を++iを使い、カウントする。 ++i;         //++iはただs1[i] とs2[i]の文字が合致してるか確認を行う。s1[]=”Good”なら s2[]=”Good”の各文字が合致してるかどうか。 } s1[i] = '\0';    //s1[i]にエンターキーが入力されて、void mystery(char s1[],char s2[])内のループを抜ける。 return;       //s1[i] = '\0'で'\0'が定義されているのでreturn 0;でない? } ↑上記動作質問://より右側の文章は文章的に正しいでしょうか? void mystery(char s1[],char s2[])内でどんな動作をしてるのかが、イマイチよく分からないのです。 ↓下記のプログラム #include <stdio.h> #include <stdlib.h> void mystery(char [], char[]); int main() { char m1[81],m2[81]; int i; printf("Message?"); gets(m1); mystery(m2,m1); puts(m2); system("PAUSE"); return 0; } void mystery(char s1[],char s2[]) { int i=0; while(s2[i]!='\0'){ s1[i] = s2[i]; ++i; } s1[i] = '\0'; return; }

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

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

うーん。。。 動作の説明としては全て間違いです。 >while(s2[i]!='\0'){ s2のi番目の要素が終端文字で無い間繰り返し処理します。 #エンターキー云々は関係ありません。 >s1[i] = s2[i]; s1のi番目の要素にs2のi番目の要素をコピーしています。 #比較ではなく代入です。 >++i; ここでのiは文字列の要素を表す要素番号に過ぎません。 #次の文字へ進むだけで、カウントなどしていません。 >s1[i] = '\0'; s2が文字列の終わりを検出したので、 ループを抜けてs1にも文字の終端を書き込んでいます。 #ここでは既にループを抜けた後です。 >return;  関数の戻り値はvoidつまり「無し」なので returnで評価される式も在りません。 #疑問系でコメントを書くなら書かない方が良いです。 #混乱のもとですから。。。 短くすると・・・:-p void mystery(char *s1, const char *s2){   while (*s1++ = *s2++); }

jpncndgoo2
質問者

お礼

丁寧な回答有難うございました。 #疑問系でコメントを書くなら書かない方が良いです。 #混乱のもとですから。。。→ハイ・・・ かなり助かりました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「文章的に正しいか」といわれると, 「日本語の文章としては (構文上) 間違っていないけど, 実際の動作の説明にはまったくなっていない」ということになるかなぁ. だいたい, 「エンターキー」って何? あっさり答えだけ書いちゃうと「s2 から s1 に『文字列』をコピーする」です. どうしてそうなるかは, がんばって資料を探してください.

jpncndgoo2
質問者

補足

回答有難うございます。 エンターキー→enterキー です。 「s2 から s1 に『文字列』をコピーする」→それはなんとなく分かるのですが・・・。 出来ましたら、「実際の動作の説明」を教えていただけないでしょうか? お願いします・・・。

関連するQ&A

  • 暗号化文 3択させるためのプログラム 何で??

    忙しい中失礼します。下記のプログラムをいじり、「欲しい動作」を完成させたい、と思っています。 ・・・が出来ないのです。 どうか教えて下さい。お願いします。 アドバイスでもいいです。お願いします。 欲しい動作 1.ユーザーに3択 [1ENCRYPT(暗号化)/2DECRYPT(標準化)/3QUIT(中止)] を尋ねる 2.ユーザーが1(ENCRYPT)を選択した場合、次に文章を入力し、 THE FOX BROWN エンターキー WKH IRA EURZQ 表示[暗号化:元の文字から3文字ずらして表示] というように表示させるプログラムを作成しています。 質問:ユーザーに尋ねる3択方法なのですが、どういったプログラムを組めば、1選択後にTHE・・・のような文章を入力後→エンターキー→暗号文といった動作が得られるのでしょうか? 私のプログラムでは、DOS画面上でどういうわけか 1 を選択した後、直ぐ(文章を入力することなく)、Press・・・continue となってしまいます。 何で??です? どこをどういじれば、希望する動作になるのでしょうか? お願いします。 私のプログラムは以下です。 #include <stdio.h> #include <stdlib.h> int main() { void mystery(char); char sen; int num1; printf("What do you want? Select the number\n"); printf(" 1.encrypt Cange decryption letters into encryption letters\n"); printf(" 2.decrypt Cange encryption letters into decryption letters\n"); printf(" 3.quit You don't need to write letters.\n"); printf("Enter the number: "); scanf("%d", &num1); if(num1 == 1) { printf("You select encrypt.\n"); printf("Enter your sentence: "); mystery(sen); } else if(num1 == 2) { printf("You select decrypt.\n"); } else { printf("You don't do anything.\n"); } system("pause"); return 0; } void mystery(char sen) { char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int c, i; int j=0; while((c = getchar()) != '\n') { for(i = 0; upper[i]; i++) { if(c == upper[i]) { c = upper[(i + 3) % 26]; break; } } if(j<20) putchar(c); j++; } }

  • 問題文に対してこのプログラムは正しいか

    文字列を先頭から1文字ずつ表示する関数を作成せよ。 void gput(const char *s, int speed); ここで、sは表示する文字列、speedはミリ秒単位の表示速度である。たとえば、 gput("ABC", 100); と呼びだすと、まず'A'を表示し、その100ミリ秒後に'B'を表示し、さらにその100ミリ秒後に'C'を表示する。このようにして"ABC"の全文字を表示すると呼び出し元に戻ること。 /* 課題2-1 */ #include <time.h> #include <stdio.h> #include <stdlib.h> /* gput関数の宣言 */ void gput(const char *s, int speed); /* sleep関数の宣言 */ int sleep(unsigned long x); int main (void) { gput("ABC", 1000); return (0); } /* gput関数の定義 */ void gput(const char *s, int speed) { int i; int c = strlen(s); for(i=0; i<c; i++){ putchar(s[i]); fflush(stdout); sleep(speed); } } /* sleep関数の定義 */ int sleep(unsigned long x) { clock_t c, s = clock(); do{ if((c = clock()) == (clock_t)-1) return (0); }while(1000UL * (c - s) / CLOCKS_PER_SEC < x); return (1); } 演習問題に解答が無いので質問します。 呼び出し元に戻ることとは、gput関数を呼び出した後にmain関数に戻ることを言っているのでしょうか。 またsleep関数では、return 0とreturn1を使い分けていますがそれぞれどういった意味があるのですか。 関数の返り値は理解できるのですが、本にmain関数のreturn0についてなど何も触れられていないので混乱しています。

  • プログラムの動作

    10文字をスキップするプログラムなのですが、どのようにスキップしているのかわからないので教えてください。 下にソースコードを書きます。 #include <iostream> using namespace std; //10文字をスキップする istream &skipchar(istream &stream) { int i; char c; for(i=0; i<10; i++)stream >> c; return stream; } int main() { char str[80]; cout << "いくつかの文字を入力する:"; cin >> skipchar >> str; cout << str << endl; return 0; } よろしくおねがいします。

  • 下記、プログラム内の「char *」の役割

    C++初心者です。 縦長になってしまいますが、 『 #include <iostream.h> void show(int); void show(double); void show(char *);   ←左記の記述の使い方 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char *z) { cout << z << endl; } 』 のプログラムにおいて、「char *」の使い方がいまいち理解できません。 上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。 『 #include <iostream.h> void show(int); void show(double); void show(char);   //←---------上記と違う行 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char z) {  //←---------上記と違う行 cout << z << endl; } 』 なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

  • プログラムの動作

    独学でプログラムの勉強をしようと、サイトや本を見ながら勉強しているのですが、ポインタの使用がいまいち理解できません。 下にあるプログラムの動作の流れを順を追って教えていただきたいです。 (細かくいいますと、ポインタの動きと関数の動きの点を重点的に教えていただきたいです。(特にfor文内) 『以下プログラム』 1: #include<stdio.h> 2: 3: void h(char **p){ 4:     (*p)++; 5: } 6: 7: int main(void){ 8: 9: int i; 10: char str[]="abcdefghij"; 11: char *p_str; 12: 13: p_str=str; 14: for(i=0;i<(sizeof(str)/sizeof(str[0]));i++){ 15: printf("[%s]\n",p_str); 16: h(&p_str); 17: } 18: 19: return(0); 20: } 出力結果 [abcdefghij] [bcdefghij] [cdefghij] [defghij] [efghij] [fghij] [ghij] [hij] [ij] [j] []

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • 自作関数を用いた文字の反転

    タイトルのまんまですが入力された文字を反転して表示する方法がわかりません。 #include <stdio.h> char reversecopy(char moji[]) { int i; char reversemoji[51]; for(i = 50; i > 0; i--) { reversemoji[i] = moji[i]; } return reversemoji[50]; } void main(void) { char n[51]; printf("何か文字を入力してください: "); scanf("%s" ,n); reversecopy(n); n[50] = '\0'; printf("%s\n" ,n); return; } ここまでは作ったのですが、表示されるのは反転されていない文字です。どこかおかしい点があったら(絶対あるはずですが)ご指摘いただければ助かります。 よろしくお願いしますm(_ _)m

  • c言語についてです。

    文字の順番を逆さまにするプログラムなのですが実行してenterキーを押しても何もおこりません。原因がわかる方がいたら教えてほしいです。 初歩的な質問ですみません。 使っているパソコンはMacBookProです。 #include<stdio.h> void reverse(char[],char[]); void divide(char[],char[]); int main(void) { char s[100],t[100]; gets(s); reverse(s,t); divide(t,s); printf("%s %s\n",s,t); return 0; } void reverse(char s[],char t[]) { int i=0,j=0; while(s[i]!=0){ i++; } i--; while(i>=0){ t[j]=s[i]; i--; j++; } t[j]=0; return ; } void divide(char t[],char s[]){ int i=0,j=0; while(t[j]!=' '){ i++; } t[i]=0; i++; while(t[i]!=0){ s[j]=t[i]; j++; i++; } s[j]=0; return ; }

  • 関数がうまく動作しない

    関数get_monthにchar *型の文字列を引数にして、先頭の三文字(大文字でも小文字でも可)が正しいかどうかを関数strnxcmpでチェックしていくものです。 ところが、関数get_month中のreturn iで帰ってくるのはメインプログラムを動作させたところいつも0になってしまっているようです。(本当は1~12が帰ってくるようにしたい。) for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i;←ここのリターンで0が帰ってきてしまう。 } } } 何がおかしいためにこのようになってしまうのでしょうか? よろしくお願いします。 int strnxcmp(const char *s1,const char *s2,size_t n) { while(n && toupper(*s1) && toupper(*s2)) { if(toupper(*s1) != toupper(*s2)) { return ((unsigned char)*s1 - (unsigned char)*s2); } s1++; s2++; n--; } if(!n)return 0; if(*s1) return 1; return -1; } int get_month(char *s) { int m,i; char *tuki[]={"","January","Feburary","March","April","May","June","July","Augst", "September","October","November","December"}; for(i=1;i<=12;i++) { if(strnxcmp(tuki[i],s,3)==0) { return i; } } return -1; }

  • void **(char や intのアドレス混在)について

    printf("%d",voidd[0]);にてほしい値が表示されません。 どうすればいいですか? よろしくお願いします。 #include<stdio.h> int main() { /* Calc.StringExpressionGet("1+((2+34)*2-111*77)*5-67*8/90"); Calc.StringExpressionResolve(); Calc.Print(); */ int num[3]; num[0]=111; num[1]=222; num[2]=333; char str[4]="ABC"; void **voidd; voidd=new void*[6]; voidd[0]=(void *)&num[0]; voidd[1]=(void *)&str[0]; voidd[2]=(void *)&num[1]; voidd[3]=(void *)&str[1]; voidd[4]=(void *)&num[2]; voidd[5]=(void *)&str[2]; printf("%d",voidd[0]); getchar(); return 0; }

専門家に質問してみよう