1

バイナリ文字列の個々の文字にアクセスして、それらが設定されているかどうかを確認するのに問題があります。何が間違っていますか? それとももっと簡単な方法がありますか?これが私のコードです:

#include <iostream>
#include <string>

using namespace std;

float BinToDec(const string & bin) {
    short length = bin.length();
    float result = 1.0f;

    const char * str = bin.c_str();

    for (int i = 0; i < length; ++i) {
        if ( &str[i] == "1") cout << "SET" << endl << endl;
        else cout << "NOT SET" << endl << endl;
    }

    return result;
}

int main() {

    string bin = "";

    cout << "Input a binary number: ";
    cin >> bin;

    cout << BinToDec(bin) << endl << endl;

}
4

4 に答える 4

3

文字列を直接反復することができます。bin取得する必要はありませんconst char *。また、&ここでは演算子は必要ありません。これを使用[]すると、すでに逆参照して取得してcharいるためです(これが、「1」と比較しないでください。 charではなくstring literal

全体として、これはより良いアプローチだと思います。

for (int i = 0; i < length; ++i) {
        if ( bin[i] == '1') 
             cout << "SET" << endl << endl;
        else 
             cout << "NOT SET" << endl << endl;
}

また、長さをに格納することはshort現在機能する可能性がありますが、最大値よりも長い文字列がshort存在するため、を使用する必要がありますsize_t

于 2012-11-04T21:29:06.137 に答える
2

次の理由により、うまくいきません。

  • string と比較する部分文字列を取得しようとしているようなものですが、部分文字列"1"は入力の最後で終了します...つまり、おそらく1文字を過ぎてしまいます。
  • C文字列を==比較するだけでポインター値を比較する

代わりに、個々の文字だけを比較します。

if ( str[i] == '1') cout << "SET" << endl << endl;
//  ^          ^ ^
//  |        character literals are delimited by _single_ quotes
// no `&` required

しかし、なぜあなたが使用.c_str()しているのかまったくわかりません。binこの C-string を作成する代わりに、直接操作するだけstrです:

float BinToDec(const string& bin)
{
    size_t length = bin.length();
    float result = 1.0f;

    for (int i = 0; i < length; ++i) {
        if (bin[i] == '1')
           cout << "SET" << endl << endl;
        else
           cout << "NOT SET" << endl << endl;
    }

    return result;
}

の種類も修正しましたlength

于 2012-11-04T21:24:27.913 に答える
1

C スタイルの文字列でこれを行いたい場合は、次のように変更します。

if ( &str[i] == "1") cout << "SET" << endl << endl;

if ( str[i] == '1') cout << "SET" << endl << endl;

strそうすれば、 の 1 文字を'1'リテラル文字 ( "1"1 文字を含む文字列ではなく) と比較できます。

既存のコードは、オフセット i のアドレスを c_str() に取り込んでいます。これは、文字 i で始まる文字列の末尾と実質的に同じであり、リテラル文字列 "1" と比較しています。基礎となるポインターを比較するため、このような C スタイルの文字列比較はできないことに注意してください。

于 2012-11-04T21:24:30.310 に答える
0

二重引用符ではなく一重引用符を使用して、各文字の値を確認しようとしているためです。

float BinToDec(const string & bin) {
    short length = bin.length();
    float result = 1.0f;

    const char * str = bin.c_str();

    char c; 
    for (int i = 0; i < length; ++i) {
        c = str[i];

        // Use single quotes and not double quotes here
        if ( c == '1') cout << "SET" << endl << endl;
        else cout << "NOT SET" << endl << endl;
    }

    return result;
}

そうは言っても、lccarrasco の方法は、あなたが達成しようとしていることを行う正しい方法だと思います。

于 2012-11-04T21:28:00.777 に答える