-2

文字配列の下に6などの値を格納しています。同じ値6を整数配列に渡したいのですが、単にこのコードは機能しません:

char a[3];
gets(a);              (for ex: value of a i.e a[0] is 6)
int b[3];
for(int i=0;i<strlen(a);i++)
b[i]=a[i];
cout<<b;               (it returns 54 nd not 6)

上記のコードは、6 の INTEGER VALUE を格納します。6 を直接格納することはありません。整数値(つまり54)ではなく、同じno 6を保存したい。何か案は?

前もって感謝します

4

1 に答える 1

2

整数ではなく、文字コードを保存しています。1標準入力に入力して に保存charすると、保存されるのは の ASCII コードで1あり、整数値ではありません1

したがって、それを に割り当てるときは、次のようb[i]にする必要があります。

b[i] = a[i] - '0'; // Of course, this will make sense only as long
                   // as you provide digits in input.

さらに、次のことを行います。

cout << b;

配列の内容ではなく、配列のアドレスを表示bします。また、strlen()配列aがヌルで終了していないため、ここで使用することはお勧めできません。

これがどのようにタイプセーフでないかについての考慮事項はさておき、ここであなたが意図したことは次のとおりです。

#include <iostream>
#include <cstring>

using std::cout;

int main()
{
    char a[3] = { 0, 0, 0 };
    gets(a);

    int b[3];
    for(unsigned int i = 0; i < std::min(strlen(a), 3u); i++)
    {
        b[i] = a[i] - '0';
    //              ^^^^^
        cout << b[i];
    }
}

上記を C++11 で行う方法は次のとおりです。

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string a;
    getline(std::cin, a);

    std::vector<int> b;
    for (char c : a) { if (std::isdigit(c)) b.push_back(c - '0'); }

    for (int x : b) { std::cout << x << " "; }
}

上記の関数を変更したものを次に示します。これは C++03 でも機能するはずです。

#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::string a;
    getline(std::cin, a);

    std::vector<int> b;
    for (std::string::iterator i = a.begin(); i != a.end(); i++)
    {
        if (std::isdigit(*i)) b.push_back(*i - '0');
    }

    for (std::vector<int>::iterator i = b.begin(); i != b.end(); i++)
    {
        std::cout << *i << " ";
    }
}
于 2013-03-31T12:29:46.300 に答える