зЬгср (0 функция копирует целую с-строка в положение памяти вы назначенные в качестве пункта назначения. В коде
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);
}
}
полукокса является боль в задней с станд :: iostream, он всегда должен быть вместо этого в Int. Приведение к меньшей переменной, например (char) x, может быть неопределенным поведением, поэтому необходимо замаскировать более крупные значения (char) (x & 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);
Видя, что 'strcpy' в коде вроде этого обескураживает. Если вы делаете C++, пожалуйста, * пожалуйста * используйте 'std :: string'. Функция 'strcpy', как известно, проблематична. В этом коротком примере у вас есть гигантская ошибка переполнения буфера, и поэтому это действительно плохая идея, даже начать эту дорогу. – tadman
* Howerver, похоже, что он не работает как Java * - C++ - это не Java. Не используйте Java в качестве модели при написании хорошего кода на C++. Если вы продолжаете отказываться от использования «методов Java» в программе на C++, ваша программа будет либо иметь одну или несколько из этих вещей - 1) есть ошибки, 2) быть закодирована неэффективно, 3) иметь утечки памяти 4) просто смотреть просто странный для программиста на C++. – PaulMcKenzie
Непонятно, чего вы хотите достичь, вопрос описывает неправильно сформулированную проблему и пытается решить проблему с неправильным кодом. Это «как сохранить входные данные пользователя» или «Как сохранить ввод пользователя в двоичном формате?» См. Мой ответ ниже, оба варианта охвачены – Swift