如何将输入存储到数组中?C++

4
int b;
int array[12];

cout << "Enter binary number: ";
cin >> b;

(例如:b将变为10100)
**如何将b(10100)存储到数组中,使其成为[1] [0] [1] [0] [0] **
cout << array[0] << endl;

**输出结果应该是1**

cout << array[1] << endl;

** 输出结果应该是0 **

请帮忙,谢谢。


不是作业,而是一些示例问题,供我在学期开始时练习,以免在课堂上遇到困难。 - Junior89
@Kit Ho,作为一名软件工程师,您是否编写和/或使用C++? - Junior89
@Junior89 这是一个很广泛的问题。你会发现一些工程师专门使用C++,一些偶尔使用它,还有一些从来不需要接触它。 - ssell
5个回答

9

一个 string 也可以被视为一组 char 数组。因此,您可以将输入存储到一个字符串中,然后编写的 cout 语句应该可以工作。但是,它们将是 char 而不是 int,因此您将存储 '1' 和 '0' 而不是 1 和 0。它们之间的转换很容易,只需使用 array[0]-'0'

#include <string>
#include <iostream>

using namespace std;

int main()
{
  string array;
  cout << "Enter binary number: "; cin >> array;
  // Suppose the user inputs 10100
  cout << array[0] << endl; // outputs '1'
  cout << array[1] << endl; // outputs '0'
  cout << array[2] << endl; // outputs '1'

  return 0;
}

更新:添加了可编译代码。请注意,这基本上是发布问题时的原始代码,除了输入一个string


1
OP 没有在任何地方使用字符串。 - Chris Eberle
谢谢你的帮助,我很感激。但是从你写的内容开始,我该怎么做呢?哈哈,对不起,我还是个新手,我就是不知道该如何实际地将二进制“存储”到数组中。 - Junior89
@Chris 我同意他没有使用它,但是我认为这是解决问题的最简单方法,因为他发布了它(或者说,我理解的是这样!)。 - Pablo
@Junior89 cin >> array 将用户输入的任何内容存储到 array 变量中。也许我没有理解你的问题。 - Pablo
@Pablo cout << "输入二进制数:"; cin >> binarynumber; 将binarynumber存储到一个数组中 这样当我从二进制数10100调用array[1]时,应该输出一个零,或者如果我调用array[2],则应该从数组中输出一个一。我不知道如何将输入的二进制数存储到一个数组中,这样它就会变成[1][0][1][0][0] 哈哈,你明白我想做什么吗? - Junior89
显示剩余2条评论

1

你可以使用 Boost 动态位集

#include "boost/dynamic_bitset.hpp"
#include <sstream>
#include <iostream>

int main()
{
    boost::dynamic_bitset<>     val;
    std::stringstream           input("1010101010");

    input >> val;                        // Input a binary number
                                         // Can use std::cin or another stream
    std::cout << val.to_ulong() << "\n";
    std::cout << val[5] << "\n";
}

如果您没有使用Boost,请使用std::bitset。
std::bitset唯一的问题是它具有固定的大小。
#include <bitset>
#include <sstream>
#include <iostream>

int main()
{
    std::bitset<16>             val;     // fixed 16 bit size

    std::cout << "Enter binary number:\n";   
    std::cin >> val;                        // Input a binary number
                                         // Can use std::cin or another stream
    std::cout << val.to_ulong() << "\n";
    std::cout << val[5] << "\n";
}

@Junior89:那么你做错了什么。你能具体说一点吗?注意:它使用boost(作为C++程序之一,编译器后立即安装的东西)。如果你没有boost或者没有设置包含路径来获取boost,那么它将无法编译。 - Martin York
是的,错误与boost有关,但感谢您编辑的新代码,它运行良好。唯一的问题是您提供了一个输入“1010101010”,我该如何输入自己的二进制数,例如--> cout <<“输入二进制数:”; cin >> input; - Junior89
谢谢,我已经这样做了,但是现在当我输入一个更高的二进制数,比如100100(36),正确的输出就会出错,例如我用std::cout << val[5]输出时,结果为1而不是0,如果我用val[4]输出,我得到的是0而不是1。 - Junior89
@Junior89:你想反了。如果你输入一个十进制数“36”,那么myInt [0] == 6,myInt [1] == 3。如果你输入一个二进制数,同样的规则适用:“100” val [0] == 0 && val [1] == 0 && val [2] == 1。更高位的比特将在数组中更高。你希望二进制数的行为像其他数字一样(而不是像字符串)。 - Martin York

1

我本来写了一个类似Pablo的答案,但既然他已经发布了,那么这里是另一个与给定信息一致的答案。

它接受一个int输入并将其放入一个int数组中。

#include <iostream>
#include <cmath>

int main( )
{
    int b;
    int numDigits;

    // Get bit string int
    std::cin >> b;

    // Get the number of digits
    numDigits = std::floor( std::log10( ( float )std::abs( b != 0 ? b : 1 ) ) ) + 1;

    // Dynamically create a new array of the appropriate size
    int* arr = new int[ numDigits ];

    // Initialize all the blocks of memory
    std::memset( arr, 0, numDigits );

    // Fill the array
    for( int i = 0; i < numDigits; i++ )
    {
        arr[ numDigits - i - 1 ] = b % 10;
        b /= 10;
    }

    system( "PAUSE" );

    // Delete the array
    delete [] arr;

    return 0;
}

这个动态设置数组大小,以便它正确适应。


你的代码可以运行,但是没有任何作用。当我编译它时,我插入了二进制数,然后尝试了一个大小,但是我得到的只是“按任意键继续”。 - Junior89
@Junior89 是的,这是有意的。数组已经被填充了,你可以随心所欲地使用它。它只是接收数字并将其拆分成数组,不做其他操作。 - ssell

1
以下示例将位存储到原始的C风格数组中,正如您所需。但是,如果您想要,可以将其替换为std::vector。
int main()
{
  // assume sizeof(int) is 32, or you can use heap-allocated array or std::vector
  int array[32];

  unsigned int mask = 1;
  // mask is initially 0x80000000
  mask = mask << (sizeof(int)*8 - 1);

  int i = 0;

  // we start counting from the first "1",
  // preceding "0"s are ignored to display
  bool started = false;

  int b;
  cin >> b;

  while (mask != 0)
  {
    // if current bit is "1" or "0"
    if (mask & b) 
    {
      started = true;
      array[i++] = 1;
    }
    // if current bit is "0" and counting started
    else if (started)
    {
      array[i++] = 0;
    }
    // ready to test next bit
    mask = mask >> 1;
  }

  // test result
  for (int j = 0; j < i; ++j) cout << array[j];

  cout << endl;
  return 0;
}

Test cases:
1. b = 8  => array: 1000
2. b = -8 => array: 11111111111111111111111111111000
3. ..

0

将二进制数存储到数组中


char binaryArray [5]; // The array looks like this: [][][][][]

cout << "Enter binary number: ";
cin >> binaryArray; // Stores the binary number into the array: [1][0][1][0][0]

cout << binaryArray[0] << endl; // The first element is sent to standard output.
cout << binaryArray[1] << endl; // The second element is sent to standard output.

对于您的输入,输出将是:

1
0

这里有一个字符数组。我们将二进制数输入到数组中,然后打印数组的每个元素以显示每个位。第一行打印访问第一个元素[1] [0] [1] [0] [0]。第二行打印访问第二个元素[1] [0] [1] [0] [0]。
假设我们有一个包含100个字符的二进制数。按照当前的方式输出数组的每个元素会花费很长时间。
1.) 你能想到更高效的打印数组内容的方法吗?
2.) 我们如何确保用户只输入了数字1和/或0?

嘿,非常感谢你提供的代码,它真的帮了我很多。但是这只是我的程序开头,它可以让我开始。我的程序需要做的是读取输入的二进制数,然后对于每个1,c1++并输出该数字,对于0,除了c0++ rand(1, c1)之外,还要输出该数字。我试图做的是输出“状态”,因为从二进制输入中我将展示状态。例如,对于你的二进制数100,它是无效的,因为0比1多1。如果我输入10100,则输出将为1、2、rand(1,c1)、3、rand(1,c1)、rand(1,c1)。明白我要做什么了吗?哈哈 - Junior89
等待100不会无效,抱歉。 - Junior89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接