• ベストアンサー

質問です。

このソースのメイン関数でabcxyzと入力すると、xがあるので、関数で、a(char *sew)が呼び出されて、この関数には、abcxyz渡って、関数内では、x以外なら、sewを++します。なぜ、x以外のabxyzと表示されないんでしょうか?xyzになるのが分かりません。教えてください。よろしくお願いします #include <stdio.h> char *a(char *sew) { char *p=sew; while (*p != 'x') { p++; } 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); }

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

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

C言語では文字列は、'\0'で終わるcharの並びです。 abcxyz\0 の時、 printf("%s\n","abcxyz"); とすると 'a'の位置のアドレスが渡されて\0までが表示されます。 printf("%s\n","abcxyz"+3); あるいは、printf("%s\n",&("abcxyz"[3])); とすると、3番目の位置'x'のアドレスが渡されて、'\0'まで xyzが表示されます。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

まずstr[21]配列の中身を想像してください [a][b][c][x][y][z][\0]・・・ とはいっていますよね? でこれを関数aに[a]のアドレスを渡しています。 ※a(str)となっていますが、これはa(&str[0])と書き直すことができます。 この関数aは[x]のはいっているアドレスを返します。 printf("'x'以降は%sです。\n", [x]のはいっているアドレス ); となり 「'x'以降はxyzです」と表示される寸法です。

関連するQ&A