2016-08-30 15 views
0

ich zu speichern Raum versuchen ' ' als erkanntes Zeichen direkt in ein Array von Zeichen, indem Sie diese:Speicher Raum von Benutzereingaben in char-Array

char ** board = new char *[row]; 
for (int r = 0; r < row; r++) { 
    board[r] = new char[col]; 
} 

for (int r = 0; r < row; r++) { 
    cout << "Enter input: " << endl; 
    cin >> board[r]; 

} 

Aber wenn ich ' ' in die Konsole eingeben führt sie die Enter input Zeile zweimal (wenn row ist 3 3`) und dann beendet. Wie würde ich Eingaben (einschließlich Leerzeichen) direkt in die Karte speichern?

+2

Wenn Sie die ganze * Zeile * wollen, dann verwenden Sie ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) und [' std :: getline'] (http: //en.cppreference.com/w/cpp/string/basic_string/getline) statt. –

+0

Dies ist kein [mcve]. Was ist die Art von "Board"? – Xirema

+2

wieder geöffnet, wie ich denke, Sie brauchen 'get()' nicht 'getline()', aber die Frage braucht mehr Details. – NathanOliver

Antwort

1

Versuchen Sie, etwas mehr wie das hilft:

#include <iostream> 
#include <iomanip> 
#include <limits> 

char ** board = new char *[row]; 
for (int r = 0; r < row; r++) { 
    board[r] = new char[col]; 
} 

for (int r = 0; r < row; r++) { 
    std::cout << "Enter input: " << std::endl; 
    std::cin >> std::noskipws >> std::setw(col) >> board[r]; 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

jedoch, wie bereits in den Kommentaren vorgeschlagen, sollten Sie wirklich std::string und std::getline() stattdessen verwendet werden. Und wenn Sie können, ändern Sie Ihre Array std::vector<std::string>:

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

std::vector<std::string> board(row); 

for (int r = 0; r < row; r++) { 
    std::cout << "Enter input: " << std::endl; 
    std:getline(std::cin, board[r]); 
} 

Wenn Sie nicht std::vector verwenden können, können Sie zumindest std::string verwenden zum Lesen der Eingabe des Benutzers und kopieren Sie dann seine Daten in Ihren char[][] Array:

#include <iostream> 
#include <string> 
#include <cstring> 

char ** board = new char *[row]; 
for (int r = 0; r < row; r++) { 
    board[r] = new char[col]; 
} 

for (int r = 0; r < row; r++) { 
    std::cout << "Enter input: " << std::endl; 
    std::string input; 
    std::getline(std::cin, input); 
    std::strncpy(board[r], input.c_str(), col-1); 
    board[r][col-1] = '\0'; 
} 
+0

Danke! Aus irgendeinem Grund löst die Verwendung von strncpy Fehler aus, wenn ich versuche zu kompilieren: "Diese Funktion oder Variable ist möglicherweise nicht sicher. Verwenden Sie stattdessen strncpy_s." Strncpy_s scheint jedoch auch nicht zu funktionieren. –

+1

'strncpy()' ist eine Standard-C-Funktion, '' wickelt sie in den 'std'-Namespace. 'strncpy()' ist "unsicher", weil die Ausgabe nicht nullterminiert ist, wenn die Eingabedauer> = der angegebenen Ziellänge ist. 'strncpy_s()' garantiert Null-Terminierung, ist aber eine nicht standardmäßige Microsoft-Funktion, die '' nicht umschließt, also müssten Sie '' stattdessen verwenden und die 'std ::' löschen. Oder Sie können '_CRT_SECURE_NO_WARNINGS' definieren oder' #pragma warning' verwenden, um die Warnung zu deaktivieren. Sehen Sie, was passiert, wenn Sie C-Code mit C++ - Code mischen? Sie sollten wirklich aufhören, 'char *' Zeichenfolgen in C++ zu verwenden. –

0

Ihr Problem ist, dass die Konsole die ' ' nicht als gültige Eingabe erkennt, so dass sie erneut fragt. Ich weiß nicht, ob get() oder getline() anstelle von cin wird funktionieren, aber Sie müssen einen Weg finden, so dass die Konsole als Eingabe den Leerraum, oder Sie könnten eine Art von Filter erstellen, so dass Ihr Programm einen speziellen char als Leerzeichen erkennen und Läden ist es so. Hoffe, dass

+0

Ja. Ich verstehe das sehr. Aber ich habe keine Ahnung, wie ich die Eingabe bekommen soll, damit sie '''' erkennt und diese Eingabe in mein Board speichert. –

+0

Sie können eine if-Anweisung setzen, wenn die Eingabe also eine Kombination von Zeichen ist, speichert sie nicht das Leerzeichen, sondern ein Leerzeichen – Chris

Verwandte Themen