Как прочитать пользовательский ввод с добавлением пробела или другого символа? - PullRequest
5 голосов
/ 12 июня 2011

Я хочу прочитать пользовательский ввод, что-то вроде здесь:

char *text  = new char[20] ;
cin >> text ;

но если пользователь вводит "привет", я хочу, чтобы мои другие пустые символы были заполнены пробелом или -, что-то вроде:

"hello------------------------"

Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 12 июня 2011

Нет стандартного и быстрого способа сделать это.Я могу подумать о некоторых вариантах.


Предположим, у нас есть:

char *text  = new char[20];
cin >> text;

Примечание - нам нужно , чтобы знать, что емкостьэто 20!Я бы порекомендовал вам использовать некоторую константу для этого, особенно если это будет использоваться и для других строк.


Хорошо, первый вариант - используйте std::stringstream

std::stringstream ss;
ss << setw( 20 - 1 ) << setfill( '-' ) << text;
//            ^^^^ we need one byte for the '\0' char at the end
ss >> text;

Но это довольно медленно.


Заполните символы от руки:

int length = strlen( text );
for( int i = length; i < 20 - 1; ++i ) // again - "20-1" - '\0'
{
    text[ i ] = '-';
}
text[ 20 - 1 ] = '\0'; // don't forget to NULL-terminate the string

И лучший способ , по мне - избавьтесьиз этих char* вещей (вы пометили вопрос как ) и просто используете std::string.

std::string sText;
std::cin >> sText;
sText.resize( 20, '-' ); // NOTE - no need to NULL-terminate anything

Voilà! (:

Этот способ намного более понятен, и вам не нужно продолжать использовать delete[] text; в конце (что иногда бывает не так тривиально, особенно в случае какого-то исключения до delete[] -это даст вам 100% утечки памяти. Конечно, вы всегда можете использовать умные указатели .. но умные указатели для этого ?! :))


Конечно, вы можете написать 19 вместо20-1, я просто хотел «выделить» -1, если вы используете какую-то константу.

2 голосов
/ 12 июня 2011

Никто из вас не сказал ничего о нулевом символе-терминаторе - '\ 0'. Это действительно важно при работе со строками в C / C ++. Например, если вы хотите, чтобы ваш текст был длиной 20 символов, вы должны выделить память для 21 символа. Это только для информации для Ата . И ответ на ваш вопрос:

char *text = new char[21];
//start initialization
for (int i=0;i<20;i++) {
    text[i] = '-';
}
text[20] = '\0';
//end initialization
cout << "Your input: " << endl;
cin >> text;//get the user input
text[strlen(text)]='-';//change the automatically added '\0' with '-'
cout << text << endl;

Помните, что вам также следует проверить, не вводил ли пользователь что-то более длинное, чем выделенная вами память.


РЕДАКТИРОВАТЬ: Ну, Кирилл был быстрее (и точнее), чем я. :)

0 голосов
/ 12 июня 2011

Вы можете сделать это несколькими способами.Например, предположим, что у вас есть строка, полная 19 "-": (обратите внимание, что вы определили массив с 20, вы можете получить только 19 реальных символов плюс окончательный \0:

const char* dashes = "--------------------";

Тогда вычитайте строку при записи:

char *text  = new char[20] ;
cin >> text ;

и затем вы можете использовать strcat для копирования остальных символов, используя strlen для определения длины прочитанной строки:

strcat(text, dashes + strlen(text));

Это добавит в текст покой 19 - length of the text. Обратите внимание, что я добавляю это конкретное количество к указателю * 1014. *

Наконец, >> будет читать только одно слово.полную строку ввода вы должны использовать getline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...