アルファベットの大文字のみの文字列を与えられたときに、DをAに変換するように、つまり、3つ前のアルファベットに変換して表示させるプログラムを書きたいです。その際に僕は下記のように安直に条件分岐でA~Zの26通りについて記述しました。
しかし実行してみると、(おそらく)65文字以上の文字列を入力すると、 フ みたいな文字が出力されて正しく表示されませんでした。
僕なりには、正しく実行される限界の文字数、「64」というのが情報量の方面で何かしら関係があるのでは、と思いましたが、実際のところはどうなんでしょうか。
また、下記のコードのように条件分岐を多用したコードを正しく実行させる方法(解決策)はあるのでしょうか。
ご回答よろしくお願いします。
実行したいこと) D→Aに、C→Z(A,B,CはX、Y、Zに対応しています)のように変換して、例えば
MDSTQ が入力されたら JAPAN を出力するようにしたい。
また与えられる文字列は1000文字以内と定められています。
(以下コード) C++です
#include <iostream>
using namespace std;
int main() {
char original[1001];
char answer[1001];
cin >> original;
for (int i = 0; i<original[i]!='\0'; i++) {
if (original[i] == 'D') {
answer[i] = 'A';
}if (original[i] == 'E') {
answer[i] = 'B';
}if (original[i] == 'F') {
answer[i] = 'C';
}if (original[i] == 'G') {
answer[i] = 'D';
}if (original[i] == 'H') {
answer[i] = 'E';
}if (original[i] == 'I') {
answer[i] = 'F';
}if (original[i] == 'J') {
answer[i] = 'G';
}if (original[i] == 'K') {
answer[i] = 'H';
}if (original[i] == 'L') {
answer[i] = 'I';
}if (original[i] == 'M') {
answer[i] = 'J';
}if (original[i] == 'N') {
answer[i] = 'K';
}if (original[i] == 'O') {
answer[i] = 'L';
}if (original[i] == 'P') {
answer[i] = 'M';
}if (original[i] == 'Q') {
answer[i] = 'N';
}if (original[i] == 'R') {
answer[i] = 'O';
}if (original[i] == 'S') {
answer[i] = 'P';
}if (original[i] == 'T') {
answer[i] = 'Q';
}if (original[i] == 'U') {
answer[i] = 'R';
}if (original[i] == 'V') {
answer[i] = 'S';
}if (original[i] == 'W') {
answer[i] = 'T';
}if (original[i] == 'X') {
answer[i] = 'U';
}if (original[i] == 'Y') {
answer[i] = 'V';
}if (original[i] == 'Z') {
answer[i] = 'W';
}if (original[i] == 'A') {
answer[i] = 'X';
}if (original[i] == 'B') {
answer[i] = 'Y';
}if (original[i] == 'C') {
answer[i] = 'Z';
}
}
for (int i = 0; original[i] != '\0'; i++) {
cout << answer[i];
}
return 0;
}
No.1
- 回答日時:
for(int i=0; original[i]!='\0';i++)
にすれば解決できます。
また、ループ内は、そんなに分岐しなくていいです。
if(original[i]<='A'+3) {
answer[i]=original[i]-3;
} else {
answer[i]=original[i]-3+26;
}
にすればいいです。
手元にはパソコンはなくて、確認できないです。やってみてはいかがでしょうか
No.2ベストアンサー
- 回答日時:
>しかし実行してみると、(おそらく)65文字以上の文字列を入力すると、 フ みたいな文字が出力されて正しく表示されませんでした。
質問者の推測通り、original[i] が想定外の文字の場合、たとえば小文字だった場合、変換されないので、answer[i] に文字が書き込まれないため、フ みたいな文字が表示されます。
避けるためには、初めにanswer[i] =' '; (スペース)を代入してから、
if (original[i] == 'D') {
answer[i] = 'A';
}if (original[i] == 'E') {
を実施すればよいと思います。
なお、私なら、
}if (original[i] == 'E') {
ではなく
}else if (original[i] == 'E') {
にしますけど。
おまけ、
No1さんのプログラムも一理ありますが、これは文字コードがABCの順番に割り振られていること(JISコードなど)を利用しているので、コード体系が違う場面では、希望した処理にならないプログラムが出来上がる可能性があります。
No.4
- 回答日時:
最初の for 条件の記載ミス
answer に A-Z 以外の文字を出力しないなら、以下のように出力方法を変更
int j = 0;
for (...) {
...
if (original[i] == 'D') { answer[j++] = 'A'; }
...
}
answer[j++] = '\0';
for (j = 0; answer[j] != '\0'; j++) {
cout << answer[j];
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- 英語 このHowの使っている意味と答え方を教えてください。 2 2022/10/29 11:34
- 英語 【 論・表 英訳 】 問題 次の文を英訳せよ。 クラスの誰もその質問に答えられませんでした。 解答 4 2022/07/25 21:43
- 英語 正しい英文を教えてください。 2 2023/06/08 04:02
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
(C言語)関数の中で文字列比較で...
-
C言語のステップ数をカウントす...
-
gets fgetsについて
-
C言語で16進数文字列から16進数...
-
charと%c , %s の関係について
-
文の意味
-
全角文字のチェック
-
C言語 配列 文字列
-
マイナスからプラスへ転じた時...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
数字以外が入力されたらエラー...
-
C言語で簡単なパックマンゲーム...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
1行の文字列を時間差で表示する...
-
エディットボックスに入力され...
-
[Java]文字列分割
-
文字列の途中に「0」がある場...
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
fgetsでバッファ残留文字列を無...
おすすめ情報