質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

1922閲覧

再帰関数を使った回文判定のプログラム

erumoa400

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/09 11:57

再帰関数を使って回文判定をするプログラムを書いています。
下のコードで、カンマは正しく処理しますがスペースを受け取るとそこで入力が別々になってしまいます。
どうすればスペースを入力しても、正しく出力できますか?

c++

1#include <iostream> 2#include <cctype> 3using namespace std; 4 5bool palindrome(char str[], int a, int b); 6 7int main() { 8 char str[100]; 9 while (true) { 10 cout << "Enter a string: "; 11 cin >> str; 12 if (strcmp(str, "quit") == 0) { 13 break; 14 } 15 else if (isAPalindrome(str, 0, strlen(str) - 1) == true) { 16 cout << str << " is a palindrome" << endl; 17 } else { 18 cout << str << " is not a palindrome" << endl;; 19 } 20 } 21} 22 23bool palindrome(char str[], int a, int b) { 24 if (a > b) { 25 return true; 26 } else if (ispunct(str[a]) == true || isspace(str[a]) == true) { 27 return a++; 28 } else if (ispunct(str[b]) == true || isspace(str[b]) == true) { 29 return b--; 30 } else if (toupper(str[a]) == toupper(str[b])) { 31 return palindrome(str, a + 1, b - 1); 32 } else { 33 return false; 34 } 35} 36 37/* 38出力結果 39Enter a string: abA 40abA is a palindrome 41Enter a string: ab,a 42ab,a is a palindrome 43Enter a string: ab a 44ab is not a palindrome //ここでabとaに分かれる 45Enter a string: a is a palindrome //ここは自動で出力される 46Enter a string: quit 47*/ 48/* 理想 49Enter a string: ab a 50ab a is a palindrome 51*/ 52

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/11/09 22:24

質問のコードはコンパイルエラーになり、実行できません。 コメントに書かれている出力結果を得られるコードを提示してください。
guest

回答2

0

私が読み違いしているかもしれないけれど、ispunct, isspace 判定にかかった時の return はそれぞれ対象のパラメータを動かした palindrome 関数なのではないでしょうか?
return a++ または b-- だと、そこで再帰がとまってしまうような。返り値 bool でもないし。

投稿2021/11/10 02:27

編集2021/11/10 02:36
WoodenHamlet

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/11/10 02:46

こんな感じで,貼られたコードに質問内容(本件で言えば入力の方法である)とは関係ない間違いがある場合, その話だけを回答として書くべきかどうか? って迷いますよね.
WoodenHamlet

2021/11/10 04:00

書いた後でitagagakiさんの解答見て「あ、俺質問に答えてねえ!」ってなりました。これは単純に私のミスですねw
fana

2021/11/10 04:39

「まず,質問への回答はこれ. で,それはそれとして……」という形にして,プラスアルファ的に含めてしまう形態の回答が既に成されてしまっていると, 同じ手が使えない(「回答」の部分が同じになっちゃう)から,困るんすよね.
WoodenHamlet

2021/11/10 05:09

そういう場合は、私なんかだと例えば「質問の件に関しては●●さんが回答されている通りだと思います。他に質問者さんのソースを読んでいると、……が気になります」とか回答しますかねえ
guest

0

cinからの入力はタブやスペースごとに区切られます。
入力にはgetlineを使うと良いと思います。

あと、ispunctisspaceの戻り値はboolではなくintで0または0以外の何らかの値ですので、boolにキャストせずtrueと比較するのは正しくないです。boolにキャストするか、もしくは0かどうかで判定しましょう。

投稿2021/11/09 12:47

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問