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

您可以直接在您的 string 上进行迭代bin,无需获取const char *&这里也不需要操作符,因为通过使用[]您已经取消引用并获得 a 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;
}

此外,现在将长度存储在 a 中short可能有效,但字符串长度超过了最大值short,因此您应该使用size_t.

于 2012-11-04T21:29:06.137 回答
2

它不适合你,因为:

  • 你有点试图获得一个子字符串来与字符串进行比较"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;

这样,您将比较strwith的单个字符'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 回答