- 締切済み
配列の中を変更
入力したnameに、入力したageの数だけ文字を進める(例えばnameがOda、ageが12→表示結果がAmp)にする関数を作成しようとしたのですが、やり方がまったくわかりません。 そもそもこのような場合、文字1つ1つに別の配列を使わなければならないのでしょうか? #include <stdio.h> #define N 1 #define NAME 20 typedef struct{ char name[NAME]; char age; } person; int main(void){ int i; person persons[N]; for(i=0;i<N;i++){ printf("name > "); scanf("%s" , persons[i].name); printf("age > "); scanf("%d" , &persons[i].age); } for(i=0;i<N;i++){ printf("name = %s\n" , persons[i].name); printf("age = %d\n" , persons[i].age); } return 0; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- crew21
- ベストアンサー率26% (58/222)
No.1です。E-Yuさんとの会話になってしまって申し訳ない。 >数の変更があったときに柔軟に対応できるプログラムを早いうちに身に付けておくことは、非常に重要じゃないかな。っと思います。 全くその通りです。 ただなんていうのか、質問者さんのコードを読むと、ほんと失礼だけどあまりに初心者的なので、i<Nとやることでfor文がぐるぐる回ることを期待してんじゃないだろな、という気持ちで書いたのです。 >...ASCIIコード表眺めててなんとなく分かったかも。大文字と小文字の間に記号がいくつか含まれるみたいですね。恐らく、それを抜きに考えてってことでしょうか。 私も改めてASCIIコード表を見てみました。確かに大文字と小文字の間に幾つかの記号がありますね。 でも、それでも「Oda」と「12」だと「apm」にはならないと思いますが.... 例えば 'O' にその考えを適用しても、'a'にはなるけど、'A'にはなりません(なりようがない)。
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> #include <string.h> void shift(char *s, int n) { char *a = "abcdefghijklmnopqrstrvwxyzABCDEFGHIJKLMNOPQRSTRVWXYZ"; int i; while(*s){ i = strchr(a, *s) - a; if(0 <= i && i <= 51) *s = a[26 * (i / 26) + (i + n) % 26]; s ++; } } int main(void) { char s[64] = "Oda"; puts(s); shift(s, 12); puts(s); return 0; }
- E-Yu
- ベストアンサー率40% (2/5)
ANo1さんの意見ですが、 >詳しい話をする前にさ、 >>入力したageの数だけ文字を進める >ってあるけど、どうして「nameがOda、ageが12→表示結果がAmp」になるんだ?そこでもう意味がわからん。 確かに、よく分からなかったです。 >単純に、文字値を加算する(例えばaなら0x61だから12を加算してm(0x6d)にする)だけかと思ったらそうでもないよね。 私もそう考えましたけど、違うんですね・・・ そうなると、この部分は何がやりたいのか分からないですね。 ・・・っと思いましたけど、ASCIIコード表眺めててなんとなく分かったかも。大文字と小文字の間に記号がいくつか含まれるみたいですね。 恐らく、それを抜きに考えてってことでしょうか。 ちなみにその場合、「Oda」と「12」だと「apm」になりませんか?>質問者さん >あとさ、何がやりたいのかわからんけど、Nは1だよね。 >あとfor文でまわす条件判断文でi<Nってやってるけど、Nは1だから一回しかループせんよ。 とありますけど、数の変更があったときに柔軟に対応できるプログラムを早いうちに身に付けておくことは、非常に重要じゃないかな。っと思います。 現在Natsu_Kazeさんは手詰まり状態なわけですけど、デバッグの際はできるだけ状況を単純にする、簡単に考える(例えば今回の場合、配列の数を1つにする)ということも有効な手段ではないかと思います。 後半の意見はNatsu_Kazeさんの今後のプログラミングの仕方にも影響を与えそうでしたので、私見を述べさせていただきました。失礼いたしました。
- php504
- ベストアンサー率42% (926/2160)
Oda -> Apm ですね 大文字だけなら char* pname; pname = persons[i].name; while (*pname) { if (*pname >= 'A' && *pname <= 'Z') { *pname += persons[i].age; if (*pname > 'Z') { *pname -= 26; } } pname++; }
- crew21
- ベストアンサー率26% (58/222)
詳しい話をする前にさ、 >入力したageの数だけ文字を進める ってあるけど、どうして「nameがOda、ageが12→表示結果がAmp」になるんだ?そこでもう意味がわからん。 単純に、文字値を加算する(例えばaなら0x61だから12を加算してm(0x6d)にする)だけかと思ったらそうでもないよね。 あとさ、何がやりたいのかわからんけど、Nは1だよね。 だとしたらわざわざtypedefしてperson作らなくっていんじゃないの? ※あとでNを1以外にした場合のことを考慮してるのかもしれんが。 あとfor文でまわす条件判断文でi<Nってやってるけど、Nは1だから一回しかループせんよ。 なにがやりたいんだ?
補足
回答してくださった方々ありがとうございます。 わかりにくい書き方をしてしまい済みませんでした。 zの次はa、Zの次はAであるものとするということです。 大文字はA.B.C.....Y.Z.A.B.... 小文字はa.b.c.....y.z.a.b.... これでもわかりにくいかもしれませんが・・・