0

バイナリ入力の文字列をintのベクトルに変換しようとしています。組み込みのC++関数を使用せずにこれを実行したいと思います。これがコードのスニペットと実行エラーです(正常にコンパイルされます)。

入力例: "1011 1001 1101"

ints 11、9、および13としてベクトルに格納する必要があります

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()  
{
    string code,key;
    vector<int>digcode;
    vector<int>ans;
    cout<<"Enter binary code:\n";
    getline(cin,code);
    cout<<"Enter secret key:\n";
    cin>>key;

    for(int i=0;i<code.length();)
    {
        int j=2, num=0;
        while (code[i]!=' '&&i<code.length())
        {
        num*=j;
        if (code[i]=='1')
        num+=1;
            i++;
        }
        cout<<num<<" ";
        digcode.push_back(num);
        if(code[i]==' '&&i<code.length())
            i++;
    }
}

エラーメッセージ:「デバッグアサーションに失敗しました!」「式:文字列の添え字が範囲外です」

最後の番号を除くすべてが印刷され、保存されます。下付き文字が大きくなりすぎる場所を探すためにforループとwhileループをトレースしましたが、あまり運がありませんでした。

どんな助けでも大歓迎です!ありがとう。

4

3 に答える 3

1

オペランドの順序が間違っています。

while (code[i]!=' '&&i<code.length())

への変更:

while (i < code.length() && code[i]!=' ')

if次のステートメントについても同じです。2番目のオペランドは、最初のオペランドがtrueの場合にのみ評価され、範囲外のアクセスを防ぎます。

于 2012-06-18T21:03:01.130 に答える
0

数字をスペースで解析した後?strtol()基数変換を提供して整数値を取得できる関数があります。

こちらをご覧ください

于 2012-06-18T21:03:18.467 に答える
0

あなたのコードはかなり単純化することができます:

for (std::string line; ; )
{
    std::cout << "Enter a line: ";
    if (!std::getline(std::cin, line)) { break; }

    for (std::string::const_iterator it = line.begin(); it != line.end(); )
    {
        unsigned int n = 0;
        for ( ; it != line.end() && *it == ' '; ++it) { }
        // maybe check that *it is one of { '0', '1', ' ' }

        for ( ; it != line.end() && *it != ' '; ++it) { n *= 2; n += (*it - '0'); }
        std::cout << "   Read one number: " << n << std::endl;
    }
}
于 2012-06-18T21:26:58.593 に答える