• ベストアンサー

C言語

入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

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

  • ベストアンサー
  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

関数a が間違ってますね。 char *a(char *sew) { char *p=sew; while (*p != 'x') { p++; } return(p); } でOK

jjjj27
質問者

補足

どうして、*pとpなのですか?、あと、このソースで、どうしてstr[21]={'\n'};になるか教えてください。 宜しくお願いします。

その他の回答 (2)

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

p にポインタを設定しているが >char *p=sew; … >return(p); p 自体は変更せずにリターンしているので当初設定した文字列の先頭のアドレスが返されるので全体が表示される。 p で処理するか p を使わないのであれば return(sew); する >どうして、*pとpなのですか?、 char *p; の時は (char *)という型の変数p *p としたらp で保持されているメモリの内容(char) p は、そのアドレス >char str[21] ={'\0'}; は、初期化、 配列の内容を '\0' で初期化している。

jjjj27
質問者

補足

メイン関数でabcxyzと入力すると、xがあるので、関数で、a(char *sew)が呼び出されて、この関数には、abcxyz渡って、関数内では、x以外なら、sewを++します。なぜ、x以外のabxyzと表示されないんでしょうか?xyzになるのが分かりません。教えてください。よろしくお願いします。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } これに、全ての謎が隠されてます。 なして、*sewのポインタ進めてるのでしょう?

関連するQ&A