如何访问字符串的元素?

时间:2012-11-04 21:18:44

标签: c++

我无法访问二进制字符串中的各个字符以确定它们是否已设置,我做错了什么?或者有更简单的方法吗?这是我的代码:

#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 个答案:

答案 0 :(得分:3)

您可以直接在字符串bin上进行迭代,无需获取const char *,此处也不需要&运算符,因为使用{{1}你已经取消引用并获得了[](这就是为什么你不应该将它与&#34; 1&#34进行比较;这不是char而是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

答案 1 :(得分: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字符串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的类型。

答案 2 :(得分:1)

如果您确定要使用C风格的字符串执行此操作,请更改:

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

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

通过这种方式,您可以将str的单个字符与'1'进行比较,这是一个文字字符(而不是"1"一个包含1个字符的字符串。

现有代码将偏移i的地址带入c_str(),这实际上与从字符i开始的字符串结尾相同,并将其与文字字符串“1”进行比较。请注意,您不能像这样进行C风格的字符串比较,因为它会比较底层指针。

答案 3 :(得分: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的方式是你正在努力实现目标的正确方法。