みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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);
}

投稿日時 - 2006-02-12 16:51:53

QNo.1961196

すぐに回答ほしいです

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

関数a が間違ってますね。

char *a(char *sew)
{
char *p=sew;
while (*p != 'x') {
p++;
}

return(p);
}

でOK

投稿日時 - 2006-02-12 16:55:11

補足

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

投稿日時 - 2006-02-12 17:04:32

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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' で初期化している。

投稿日時 - 2006-02-12 18:10:04

補足

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

投稿日時 - 2006-02-12 19:07:42

ANo.2

char *a(char *sew)
{
char *p=sew;
while (*sew != 'x') {
sew++;
}

return(p);
}

これに、全ての謎が隠されてます。
なして、*sewのポインタ進めてるのでしょう?

投稿日時 - 2006-02-12 16:57:18

あなたにオススメの質問