2010-02-02 3 views
1

Я использую Turbo C++ Compiler 3.0Получение ввода от пользователя с помощью CIN

При использовании следующий код ..

char *Name; 
cin >> Name; 
cout << Name; 

Когда я дал вход с пространством ... его только сохранение набранных символов до того места .. нравится, если я дал ввод «QWERT YUIOP» ... Имя будет содержать «QWERT»;

Любое объяснение почему ??

+3

Dump Turbo C++, используйте лучший компилятор. –

ответ

2

Вам нужно выделить пространство для массива символов, в которое вы хотите прочитать Имя. char *Name; не будет работать, поскольку он объявляет указатель char не массивом символов. Что-то вроде char Name[30];

Также cin << позволяет вводить только одно слово в строку (название символа [30]).
Однако есть функция cin, которая читает текст, содержащий пробелы.

cin.get(name, MAX) 

прибудете прочтет все символы, включая пробелы, пока Макс символов не считаны или символ конца строки («\ п») достигается и поставит их в переменную имя.

+0

cin.get оставляет разделитель ("\ n") в буфере, который обычно не является тем, что вы хотите. Вот почему обычно лучше использовать cin.getline (имя, MAX). – Manuel

1

Вы только что указали символ, который не указывает ни на что. Вам нужно выделить место для вашей строки. Наиболее распространенный метод был бы выделить место на стеке, IE:

char Name[50]; 

Помните указатель обугленного сам по себе просто место, чтобы поместить адрес туда, где реальная память. Вам все равно нужно получить блок памяти и сохранить адрес в указателе. В приведенном выше коде создается массив имен в стеке, и вы можете использовать имя для хранения до 49 символов плюс нулевой терминал.

В качестве альтернативы для строк с переменной длиной используйте std :: string.

+0

Учитывая, что его компилятору около 15 лет, он еще не будет 'std :: string'. Для этого вам понадобится компилятор из 21-го века. – MSalters

+0

@MSalters LOL хорошая точка. Не видел компилятор :) –

5

Когда cin используется для чтения в строках, он автоматически разбивается на пробелы, если вы не указали иначе.

std::string s; 
std::cin >> noskipws >> s; 

В качестве альтернативы, если вы хотите, чтобы получить целую линию затем использовать:

std::getline(cin, s); 

Вы также хотите, чтобы выделить память для сырой char массива, но с C++, вы должны использовать std::string или std::wstring так или иначе.

+0

+1 для упоминания 'getline'. –

+0

@Poita_: Я не думаю, что вы понимаете, как работает носкипс. Если вы используете «cin >> noskipws >> str», и пользователь вводит «a b c», str будет содержать «a», а остальная часть ввода будет потеряна. getline() должен использоваться, если вы хотите прочитать весь текст с пробелом. – Manuel

Смежные вопросы