{{1}}
这是我使用用户输入字符串保存空char数组的代码。因此,将有5个字符串将分解为一个维度char数组,并将保存到二进制代码的每一行。 Howerver,它似乎不像Java那样可以将一维数组存储到二维数组。有没有办法让这个过程更容易,或者让方法更好?
答案 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;
}
更清洁,更简单,并且与您需要的完全相同。