2017-01-27 2 views
0
 char binarycode[5][5]; 
     string tmp; 
     cout<<"Please type first 5 binary numbers: "; 
     cin>>tmp; 
     char tmp2[5]; 
     strcpy(tmp2, tmp.c_str()); 
     binarycode[0] = tmp2; 

Это мой код для меня, чтобы сохранить пустой массив символов с пользовательской строкой ввода. Таким образом, будет 5 строк, которые будут разбиты на один размерный массив символов и будут сохранены в каждой строке двоичного кода. Howerver, похоже, что он не работает как Java, где я могу просто сохранить массив одного измерения в два массива измерений. Есть ли способ облегчить этот процесс или лучше сделать метод?C++ одномерное сохранение массива Char в двумерный массив массива

+1

Видя, что 'strcpy' в коде вроде этого обескураживает. Если вы делаете C++, пожалуйста, * пожалуйста * используйте 'std :: string'. Функция 'strcpy', как известно, проблематична. В этом коротком примере у вас есть гигантская ошибка переполнения буфера, и поэтому это действительно плохая идея, даже начать эту дорогу. – tadman

+0

* Howerver, похоже, что он не работает как Java * - C++ - это не Java. Не используйте Java в качестве модели при написании хорошего кода на C++. Если вы продолжаете отказываться от использования «методов Java» в программе на C++, ваша программа будет либо иметь одну или несколько из этих вещей - 1) есть ошибки, 2) быть закодирована неэффективно, 3) иметь утечки памяти 4) просто смотреть просто странный для программиста на C++. – PaulMcKenzie

+0

Непонятно, чего вы хотите достичь, вопрос описывает неправильно сформулированную проблему и пытается решить проблему с неправильным кодом. Это «как сохранить входные данные пользователя» или «Как сохранить ввод пользователя в двоичном формате?» См. Мой ответ ниже, оба варианта охвачены – Swift

ответ

5

Есть ли способ облегчить этот процесс или сделать способ лучше?

Рассмотрите возможность использования std::vector из std::string как 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); 
} 
+0

Это очень хороший альтернативный код, но я стараюсь не использовать код, с которым я не знаком. Так вы можете дать другое решение? –

+1

@YeramHwang Извините, тогда я бы посоветовал познакомиться с ним. Вероятно, это не лучший фрагмент кода, но независимо от того, кем вы студент или профессионал, вы всегда должны процветать для хороших решений. И что было _ «Есть ли способ облегчить этот процесс или сделать метод лучше?» _ Все о? (Не редактируйте свой пост сейчас: - |) – P0W

+3

@YeramHwang: Ваша попытка показывает, что вы * не знакомы с инструментами, которые вы использовали. Таким образом, это не выбор между тем, с чем вы знакомы, и тем, чем вы не являетесь, но между двумя вещами, с которыми вы не знакомы. Не стоит сомневаться, что вы должны ознакомиться с лучшим решением. Вы даже начнете с этого, так как вам не нужно сначала отучивать любые заблуждения, как вам нужно, по худшему пути. – celtschk

0

зЬгср (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); 
0

Ваша цель состоит в том, чтобы взять 1 одномерный массив с размером T и заселить или преобразовать его в 2 одномерный массив с размером 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; 
} 

Чище и проще и делает то же самое, что вам нужно.