アプリ版:「スタンプのみでお礼する」機能のリリースについて

アルファベットの大文字のみの文字列を与えられたときに、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;
}

A 回答 (4件)

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

にすればいいです。
手元にはパソコンはなくて、確認できないです。やってみてはいかがでしょうか
    • good
    • 0

>しかし実行してみると、(おそらく)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コードなど)を利用しているので、コード体系が違う場面では、希望した処理にならないプログラムが出来上がる可能性があります。
    • good
    • 0

いや, 質問文中の for の条件


i<original[i]!='\0'
のせいでしょう>#2.

これがどういう意味か理解できているでしょうか?
    • good
    • 0

最初の 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];
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!