2016-10-24 4 views
-2

"let_varname _ = _ 20"という形式の文字列を受け取り、 "varname"を分離してmy name変数で新しい文字列を作成するC++関数を書いています名。私は.at()関数に、スペースにヒットしたときにwhileループを反復することを止めさせようとしています(アンダースコアは空白です。スペースがあったことを十分に明確にしたいだけでした)。しかし、文字列の終わりまで完全に止まることなく(2つのスペースを経て)行くので、それらを適切に比較していません。文字と比較しないString.at()

void store(std::string exp) { 


int finalcount = 4; 
char placeholder = ' '; 
while (exp.at(finalcount)!=placeholder) { 

    finalcount++; 
} 

for (int i = 0; i < exp.size(); i++) { 
    std::cout << exp.at(i) << std::endl; 
} 


std::string varname = exp.substr(4, finalcount+1); 

std::cout << finalcount + 1 << std::endl; 
std::cout << varname << std::endl; 


} 

私はインデックスがtehの文字列の0-3が「L」「E」「T」と「」になることを知っているので、私は、インデックス4で開始。 print文は、読んでいたものと入力したものとを比較するだけのものでした。私はまた、私のwhileループ条件がASCIIコードで動作するために> 65 & & < 90でしたが、私も試してみましたが、それも動作しませんでした。

ご協力いただきありがとうございます。

+1

はこれを試してみてください。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

@πάνταῥεῖコピーペーストバージョンはどこですか?私はあなたのような気がします10k>ユーザーはいくつかの秘密のコピーペースト隠しを持っています。 –

+0

Stack Overflowで私が尋ねた唯一の理由は、私が知っている限りすべてを試したことであり、私の問題はテキストで述べられています。 –

答えて

1

あなたはistringstreamを使用してストリームとして文字列を扱うことができます:

const std::string test_data = "let varname = 20"; 
std::istringstream test_stream(test_data); 
std::string let_text; 
std::string var_name; 
char equals_sign; 
unsigned int value; 
test_stream >> let_text >> var_name >> equals_sign >> value; 

これはあなたのコードよりも多くの方が簡単です。

編集1:文字列
あなたはまたstd::string方法、find_first_offind_first_not_ofを使用することができますを検索します。

std::string::size_type position = test_data.find_first_of(' '); 
position = test_data.find_first_not_of(' ', position); 
std::string::size_type end_position = test_data.find_first_of(' '); 
let_text = test_data.substr(position, end_position - position); 
+0

これを使用して、特別なライブラリを含める必要がありますか?また、let_text == "let"?とvar_name == "varname"?値== 20ですか? –

+0

余分なライブラリは必要ありません。 –

+0

あなたのお手伝いをしていただきありがとうございます。 –

1

コメントに記載されているように、問題はあなたがsubstr()を適切に使用していないということです。また、コメントに記載されているPete Beckerのように、=をチェックして文字列の最後に達したときに停止する必要があります。スペースがなくなると文字列がオーバーランしないようにしてください。さらに、サブストリングの長さを決定するときに、finalcountに1を追加したくない場合は、サブストリングにスペースが含まれているか、チェックに失敗した=が含まれるためです。このような問題を解決する最適なツールは、あなたのデバッガです

void store(std::string exp) { 
    const int start = 4;   // <-- Enter starting position here. 
    const char placeholder_space = ' '; // Check for space. 
    const char placeholder_equal = '='; // Check for equals sign, as pointed out by Pete Becker. 

    int finalcount = start;  // <-- Use starting position. 
    bool found = false; 

    while (finalcount < exp.size() && !found) { 
     if (!((exp.at(finalcount) == placeholder_space) || 
       (exp.at(finalcount) == placeholder_equal))) { 
      finalcount++; 
     } else { 
      found = true; 
     } 
    } 
    if (!found) { 
     std::cout << "Input is invalid.\n"; // No ' ' or '=' found, put error message here. 
     return; 
    } 

    for (int i = 0; i < exp.size(); i++) { 
     std::cout << exp.at(i) << std::endl; 
    } 

    std::string varname = exp.substr(4, finalcount - start); // <-- Use starting position. 

    std::cout << finalcount - start << std::endl; // Length of varname. 
    std::cout << varname << std::endl; 
} 
+0

元のコードの別のバグを修正するためにコードを修正することができます。入力文字列が、例えば '' let varname = 20 "'である場合(つまり、検索対象のテキストに空白文字がない場合)、最初のループは文字列の最後まで実行され、例外がスローされます。 –

+0

@PeteBecker良い点、私はそれをやります。 –

+0

ええ、私の例では文字通り、文字通り取った。問題は、検索で入力テキストの終わりをチェックすることはないということです。したがって、 '' abcdefg ''が与えられれば、最後まで実行されます。 '='をチェックしないでください。 'finalcount'が' exp.size() 'よりも小さいことを確認してください。 –

関連する問題