再び課題の質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
YYY

再び課題の質問

#1

投稿記事 by YYY » 18年前

課題で文字列というものに大変苦戦しております。それで早速質問なんですがこちらがアルファベットで名前を入力した時に逆さまに表示させる方法がわからないのです。自分の書いたプログラムは
#include <stdio.h>

int main(void)
{
int moji;
int i;
char name[100];

printf("Your name: ");
gets(name);

moji = 0;
while (name[moji] != '\0') {
printf("%2d moji me : '%c'\n", moji, name[moji]);
moji++;
}
printf("%s wa zenbu de %d moji\n", name, moji);
printf("Your name : %s\n",name);

i = name[moji];
for (i = moji - 1; i >=0; i--){
printf("Reversed: %c ",i);
}
return 0;
}
で、実行結果は
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed: Reversed: Reversed: Reversed: Reversed:

意図する結果は
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed: ayara
です。最後のReversedの部分でfor文の構成はあっていると思われますが%c,%sの使い方さらに
printfで表示させたい変数が何か分からなくなってしまいました。
助けをください。

box

Re:再び課題の質問

#2

投稿記事 by box » 18年前

> printf("%2d moji me : '%c'\n", moji, name[moji]);

この文で、1文字ずつ表示するために正しくname[moji]を使っているのに、

> printf("Reversed: %c ",i);

なぜここでname[/url]を使わないのでしょうか?
なお、逆順に表示する直前の

> i = name[moji];

これは不要です。

YYY

Re:再び課題の質問

#3

投稿記事 by YYY » 18年前

name[moji]ですか?それで実行してもReversed:が繰り返されるだけなんですがどうすればいいでしょうか?

box

Re:再び課題の質問

#4

投稿記事 by box » 18年前

> for (i = moji - 1; i >=0; i--){

このfor文で、i を 文字列の最後の(moji-1)番目から1つずつ減らして、
文字列の先頭の0番目まで順番に出力しようとしていますね?
ということは、

> printf("Reversed: %c ",i);

ここで出力しなければならないのは、i でも name[moji] でもなく、
何でしょうか?

YYY

Re:再び課題の質問

#5

投稿記事 by YYY » 18年前

多分できたかな?nameですか?
一応意図する形にはなったんですがこのままだとReversed:まで繰り返されますよね?
そうならない方法ってあるんでしょうか?forの外に出すと処理されないし中に入れっぱなしだとどうしても繰り返されますよね?

box

Re:再び課題の質問

#6

投稿記事 by box » 18年前

> forの外に出すと処理されないし

おっしゃっている意味がよくわからないです。
文字列を逆順に出力する前に一度だけ「Reversed: 」と
出力したいのであれば、for文の外に書くしかありません。

for文の外に出すと処理しなかったのでしたら、
そのときのコードを見せていただけますか?

YYY

Re:再び課題の質問

#7

投稿記事 by YYY » 18年前

#include <stdio.h>

int main(void)
{
int moji;
int i;
char name[100];

printf("Your name: ");
gets(name);

moji = 0;
while (name[moji] != '\0') {
printf("%2d moji me : '%c'\n", moji, name[moji]);
moji++;
}
printf("%s wa zenbu de %d moji\n", name, moji);
printf("Your name : %s\n",name);

for (i = moji - 1; i >=0; i--){
}
printf("Reversed: %c ",name);

return 0;

}

の結果が
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed:
となります。

box

Re:再び課題の質問

#8

投稿記事 by box » 18年前

> for (i = moji - 1; i >=0; i--){
> }
> printf("Reversed: %c ",name);

う~ん、どうしてこういうコードになりますか…。
せっかくfor文のループを書いているのに、中で何もしていないですよ。

for文の「前」に "Reversed: " を一度だけ出力して、
for文によるループの「中」で name を出力してください。

YYY

Re:再び課題の質問

#9

投稿記事 by YYY » 18年前

できました。ありがとうございます。頭が固すぎましたね・・・。そんな単純でしたとは・・・。
どうも分けると改行されちゃうというイメージが出ちゃうんですよね。
文字列をもう少し深く勉強します。

閉鎖

“C言語何でも質問掲示板” へ戻る