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

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

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

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

Q&A

解決済

4回答

427閲覧

C++での文字列に関する問題です。

46hm

総合スコア20

C++

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

0グッド

0クリップ

投稿2020/04/29 05:34

###問題
入力した小文字と大文字を入れ替えるプログラムを作成したいです。入力は1行にして、出力はアルファベット以外の文字はそのまま出力したいのですが、入力でスペースを入れても出力でスペースが消えてしまいます。
また、入力してエンターを押し出力した後、一旦実行を終わりにしたいのですが、永遠に入力が終わりません。
###作成したコード

#include<iostream> using namespace std; int main(){ char ch; while(ch != '\n'){ cin>>ch; if('a' <= ch&&ch <='z'){ ch = ch - ('a'-'A'); }else if('A' <=ch&&ch <='Z'){ ch = ch + ('a'-'A'); }else if(!('a'<=ch&&ch<='Z')){ ch = ch; } cout<<ch; } return 0; }

###実行したい例
入力
fAIR, LATER, OCCASIONALLY CLOUDY.
出力
Fair, later, occasionally cloudy.

###作成したコードでの実行例
入力
fAIR, LATER, OCCASIONALLY CLOUDY.
出力
Fair,later,occasionallycloudy.

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

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

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

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

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

guest

回答4

0

スペースを拾う件については最近あった質問が参考になると思います。

別件。
chの種類は、小文字か、大文字か、それ以外かの3種類しかありえません。小文字でも、大文字でもなかったものに対して「大文字でも小文字でもない」ことを調べるのはムダ。さらに、ch=chってのは...C言語においては無意味です。なので、判別周りは

C++

1 if('a' <= ch&&ch <='z'){ 2 ch = ch - ('a'-'A'); 3 }else if('A' <=ch&&ch <='Z'){ 4 ch = ch + ('a'-'A'); 5 } 6 /* else if(!('a'<=ch&&ch<='Z')){ 7 ch = ch; 8 }*/ //これは不要

というあたりでしょうか。

なお、微妙なところですが、if('a' <= ch&&ch <='z')が確実に小文字の範囲と一致しているかというとそうは言い切れません。世の中にあるコンピュータシステムでそうでないものを探すのは大変なことかも知れない、というのは事実ではありますが。
同様に、ch = ch - ('a'-'A');によって小文字を大文字に変換できるという保証もありません。きっと上手くいくだろう、ということではありますが。

#include <cctype>
としたうえで、小文字かどうかの検査はislower(), 大文字かどうかの検査はisupper(), 小文字を大文字に変換するにはtoupper(), 大文字を小文字にするにはtolower()の各関数を使うべきです。

投稿2020/04/29 08:00

thkana

総合スコア7629

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

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

0

ベストアンサー

空行で終了します。

C++

1#include <iostream> 2#include <string> 3#include <algorithm> 4 5// 大小文字の切り替え 6std::string change(const std::string& str) { 7 std::string result; 8 for ( char ch : str ) { 9 if ( ch >= 'a' && ch <= 'z' ) { 10 ch = ch - 'a' + 'A'; 11 } else if ( ch >= 'A' && ch <= 'Z' ) { 12 ch = ch - 'A' + 'a'; 13 } 14 result += ch; 15 } 16 return result; 17} 18 19int main() { 20 std::string line; 21 while ( std::getline(std::cin, line) && line.size() != 0 ) { 22 std::cout << '[' << line << "] -> [" << change(line) << "]\n"; 23 } 24}

[追記] <cctype> 使えとの思し召しなら:

C++

1#include <iostream> 2#include <string> 3#include <algorithm> 4#include <cctype> 5 6std::string change(const std::string& str) { 7 std::string result(str.size(),'\0'); 8 std::transform(str.begin(), str.end(), result.begin(), 9 [](char ch) { return isupper(ch) ? tolower(ch) : 10 (islower(ch) ? toupper(ch) : ch); }); 11 return result; 12} 13 14int main() { 15 std::string line; 16 while ( std::getline(std::cin, line) && line.size() != 0 ) { 17 std::cout << '[' << line << "] -> [" << change(line) << "]\n"; 18 } 19}

投稿2020/04/29 06:02

編集2020/04/29 11:40
episteme

総合スコア16614

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

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

0

C++

1#include <iostream> 2 3int main() 4{ 5 for (char c; std::cin.get(c); ) 6 std::cout << (isalpha((unsigned char)c) ? char('a' ^ 'A' ^ c) : c); 7}

文字コードが ASCII でも EBCDIC でも動くはず。

isalphastd:: を付けなくてもエラーにならないのはなぜでしょう?
#include <cctype> がなくてもエラーにならないのはなぜでしょう?

追記
すみません。1行だけという条件を満たしていませんでした。

C++

1#include <iostream> 2 3int main() 4{ 5 for (char c; std::cin.get(c) && c != '\n'; ) 6 std::cout.put(isalpha((unsigned char)c) ? 'a' ^ 'A' ^ c : c); 7}

投稿2020/04/29 13:57

編集2020/04/29 16:06
kazuma-s

総合スコア8224

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

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

0

はじめに、chに初期値が入っていませんので、初回のwhile条件の動作が未定義になることに注意してください。

std::cinstd::stringを利用する場合はすでに回答がついています通り、std::getlineを使用して一行まるごと読み込むのがよいと思います。その際、'a''z''A''Z'がそれぞれ連続しているかどうかはすでに指摘がある通り処理系によるため、cctypeにあるstd::islowerstd::isupperstd::tolowerstd::toupperを使うようにしましょう。

あくまで一文字ずつ読み込みたい、でも空白文字と改行は飛ばしたくない場合、C言語よろしくcstdioにあるstd::getcharを使う方法があります。ただし、std::getcharの戻り値はintですので、一旦intで受け取って、出力時にはstd::putcharを使うか、std::coutに突っ込む際にstatic_cast<char>(ch)等で文字型にキャストする必要があります。ループ条件はエラー処理を考えなければ以下のようにすればよいでしょう。

cpp

1#include <cstdio> 2 3int ch; 4while ((ch = std::getchar()) != '\n')

投稿2020/04/29 09:36

編集2020/04/29 11:30
SIGMATURE

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問