C ++一维Char数组保存为二维Char数组

时间:2017-01-27 06:17:14

标签: c++ arrays char

{{1}}

这是我使用用户输入字符串保存空char数组的代码。因此,将有5个字符串将分解为一个维度char数组,并将保存到二进制代码的每一行。 Howerver,它似乎不像Java那样可以将一维数组存储到二维数组。有没有办法让这个过程更容易,或者让方法更好?

3 个答案:

答案 0 :(得分:5)

  

有没有办法让这个过程更容易或正在制作方法   更好?

考虑使用std::string的{​​{1}} std::vector < std::string > binarycode ;

然后,

binarycode.reserve( 5 );

std::string tmp;
for ( int i = 1; i <=5; ++i )
{
  std::cin >> tmp;
  binarycode.push_back ( tmp );
}

答案 1 :(得分:0)

strcpy(0函数将整个c-string复制到您指定为目标的内存位置。在代码中

char tmp2[5];
strcpy(tmp2, tmp.c_str());

代码

binarycode[0] = tmp2;

您试图将指针 - 该缓冲区的地址保存为一个字节。

静态分配了5个字节(!)的内存,然后尝试将字符串复制到该内存。如果有的话,你会以这种方式导致内存损坏,因为其余的字符串将某处

C ++不是Java,您应该彻底阅读有关此语言的书籍,关于您正在使用的语法和标准,而不是依赖于“看起来像”的东西。在某些领域,C和C ++之间甚至存在主要差异。

如果有的话,iostreams提供了从用户输入中获取值所需的所有工具,但“正确”的方法需要处理错误输入的情况。考虑这个功能:

#include <limits> 
#include <iostream>

char getChar()
{
    while (1) // Loop until user enters a valid input
    {
        std::cout << "Enter a byte value: ";
        int x;  // if we'll use char, cin would assume it is a character
        std::cin >> x;

        if (std::cin.fail()) // has a previous extraction failed?
        {
            // let's handle the failure
            // or next >> will try parse same input
            std::cout << "Invalid input from user.\n";
            std::cin.clear(); // put us back in 'normal' operation mode
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
            // and remove the bad input
        }
        //else if ( ((char)(x & 0xff)) != x ){
        else if(( x  > std::numeric_limits<char>::max()) ||
            ( x  < std::numeric_limits<char>::min()))
        {
            // char can be from -127 to 127, it's one byte..
            // int is allowing large values
            std::cout << "Invalid value.\n";
        }
        else // nope, so return our good x
            return (char)(x & 0xff);
    }
}

使用std :: iostream,char在背后是一种痛苦,它总是应该是一个int。转换为较小的变量,如(char)x可能是未定义的行为,因此需要屏蔽较大的值(char)(x&amp; 0xff);对于其他类型,此功能可以根据请求的类型成为模板。

现在我们应该让它理解二进制输入?没有用于二进制格式的预定义操纵器,您必须输入一个字符串,验证它并转换自己。

int binaryToDec(std::string number)
{
    int result = 0, pow = 1;
    for ( int i = number.length() - 1; i >= 0; --i, pow <<= 1 )
        result += (number[i] - '0') * pow;

    return result;
}

std::string validateEntry()
{
    bool valid = true;
    std::string tempStr;

    do
    {
        valid = true;
        getline(std::cin, tempStr);
        for (int i = 0; i < tempStr.length(); i++)
        {
            if ((tempStr.compare(i, 1, "0") != 0) && (tempStr.compare(i, 1, "1") != 0))
            {
                valid = false;
                std::cout << "Enter Valid Binary Number: ";
                break;
            }
        }
    } while (valid == false);

    return tempStr;
}

使用模式中的那些:

std::cout << "Enter Binary Number: ";
std::string binaryString = validateEntry();
int binaryNum = binaryToDec(binaryString);

答案 2 :(得分:0)

您的目标是获取大小为T的一维数组,并将其填充或转换为大小为MxN的二维数组。在编写任何代码实现之前,您需要做的是构建此算法,您需要事先知道M和N的大小或长度,在您的情况下,您已经明确表示它将是一个5x5的大小;在这种情况下,T无关紧要。 M将是行的大小,其中N将是列的大小。为此,您需要遍历单个数组的大小,然后根据其索引值,它应该对应于(m,n)值。你需要将A(n)映射到B(m,n)的另一个词。

您尝试实现的方法不是最简单的,甚至是最有效的,但在数学上模拟算法如下:

#include <iostream>
#include <string>

int main() {
    char binaryCode[5][5] { 0 }; // Initialize to all 0s
    char temp;  

    int row = 0;
    int col = 0;
    do {
        std::cout << "Enter 5 binary number: ";
        std::cin >> temp;

        for ( ; col < 5; col++ ) {
            binaryCode[row][col] = temp[col];   
        }

        col = 0;
        temp.clear();
        row++;
    } while( row < 5 );

    row = 0;
    col = 0;

    std::cout << "\nResults:\n";
    for ( ; row < 5; row++ ) {
        for ( ; col < 5; col++ ) {
            std::cout << binaryCode[row][col] << " ";
        }
        std::cout << "\n";
        col = 0;
    }

    return 0;
}

然而,这第一种方法有点幼稚,正如P0W已经说明的那样:

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

int main() {
    std::vector<std::string> binaryCodes;
    binaryCodes.reserve( 5 );

    std::string tmp;
    for ( int i = 1; i <=5; ++i ) {
        std::cin >> tmp;
        binarycode.push_back ( tmp );
    }

    return 0;
}

更清洁,更简单,并且与您需要的完全相同。