2016-12-16 20 views
1

私は便宜上、大文字と小文字を区別しない基本的なユーザーインターフェイスを作ろうとしています。これを行うには、文字列を大文字にするコンバータクラスを作成しましたが、問題が発生しました。このクラスを使用した後、main()のif文はコンバーターからのメッセージを解釈するはずですが、元の入力を読み込んだだけで、大文字の入力ではなく、変換された文字列を直接コンバータが、それは私をさせません。C++で文字列変数を返す

#include "stdafx.h" 
#include <iostream> 
#include <string> 

using namespace std; 

string response; 

//converts responses to upper-case 
void convert(string response) { 
    for (int i = 0; i < response.length(); i++) { 
     response[i] = toupper(response[i]); 
    } 
} 

//main dialogue 
int main() { 

    cout << "How are you?: "; 
    getline(cin, response); 
    convert(response); 
    if (response == "GOOD") { 
     cout << "Response 1./l"; 
    } 
     else { 
     cout << "Response 2./l"; 
    } 
} 

私はC++に非常に新しいですので、間違いが修正または私は難易度のソリューションを理解しているかのために簡単なものだった場合、私はお詫び申し上げます。

答えて

1

もう1つの方法は、stringを返すように関数ヘッダーを変更することです。

string convert(const string &inResponse) { 
    string outResponse(inResponse); 
    for (int i = 0; i < inResponse.length(); i++) { 
     outResponse[i] = toupper(inResponse[i]); 
    } 
    return outResponse; 
} 

そしてあなたのようなあなたの主な機能で返された文字列を使用します:つまり別に値の代わりに参照を渡す必要から

.... 
// response is input, outputResponse is output: 
string outputResponse = convert(response); 
.... 
+0

@ John3136できるだけコピーを避けることについての良い点。 – NoseKnowsAll

+0

私はクラスが文字列として識別される可能性があることを認識できませんでした。結局、私はgetl​​ine(cin、response)を入れました。私は応答が必要なときはいつもコンバータを呼び出していました。 – Zyxlm

+1

'私はクラスが文字列として識別できるかどうかわかりませんでした。どういう意味ですか?ソフトウェア工学の貧弱な変更を組み合わせて入力しました。実用的な解決策のいくつかのフレーバーがここに表示されていますが、それらをすべて無視していますか? – John3136

2

「値渡し」と「参照渡し」見上げて - あなたは「値渡し」しているが、あなたはC++で

を「参照渡し」期待している:あなたのケースのものでvoid convert(string& response) {

@NeilLocketzのコメントで指摘されているように、グローバルresponse、メソッド内にローカルresponseがあります。これは、呼び出しパラメータとして使用しているので、実際はグローバルなものです。適切に処理したい場合は、おそらくresponseをグローバルにしたくないでしょう。

受け入れられた回答にはこれ以上のメモリコピーが残っています。本当の鍵は、値渡しを理解し、参照によって渡し、あなたの状況に適したものを使用することです。

+1

彼はまたグローバルなレスポンスをシャドウしました –

+0

@NeilLocketz非常に良い点(私は完全に逃しました;-) – John3136

2

、あなたはC++を使用してみてください - 11機能:

void convert(string &response) { 
    for (auto &c: response) { 
     c = toupper(c); 
    } 
} 

もっとクリーンでシンプルです。

関連する問題