2015-02-24 3 views
3

Очень новичок в C++ и у меня есть следующий код:C строка один символ короче определенной длины?

char input[3]; 

cout << "Enter input: "; 
cin.getline(input,sizeof(input)); 
cout << input; 

И, войдя что-то вроде abc будет выводить только ab, разрезая его один символ коротким. Определенная длина - 3 символа, так почему же она захватывает только 2 символа?

+2

*** Определенная длина - 3 символа, так почему же она захватывает только 2 символа? *** Вам нужен дополнительный символ для нулевого терминатора. – drescherjm

+0

Спасибо! Если вы опубликуете это как ответ, я соглашусь с ним. – m0meni

+3

Если вы новичок в C++, не используйте теперь странные причуды, такие как строки стиля C. Используйте 'std :: string', который просто работает так, как вы ожидаете, а затем узнайте, как это работает, когда вы готовы противостоять истинному безумию. –

ответ

4

Помните, что c-строки имеют нулевое завершение. Чтобы сохранить 3 символа, вам нужно выделить место для 4 из-за нулевого терминатора.

Также как @MikeSeymour, упомянутый в комментариях в C++, лучше всего избежать проблемы и использовать std :: string.

3

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

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

Поскольку вы все равно используете C++, вам следует избегать массивов char-bare-bones. Некоторые причины:

  • переполнение буфера. Вам удалась эта проблема с первой попытки, подскажите!
  • Unicode осведомленность. Мы живем в 2015 году. Все еще использование 256 символов недопустимо по любому стандарту.
  • память безопасность. Это труднее протекать надлежащим string, чем простой старый массив. string s имеют сильную семантику копирования, которая охватывает почти все, что вы можете придумать.
  • простота использования. У вас есть весь список алгоритмов STL в вашем распоряжении! Используйте его, а не сворачивайте свой собственный.
+0

Не могли бы вы расширить понимание Unicode? Я не совсем понимаю, что это значит, и почему наличие 256 символов недопустимо. – m0meni

+1

Я понимаю, что ты американец. Мир, к сожалению, в большинстве неамериканских, и некоторые из этих сумасшедших неамериканцев имеют глупые способы написания, и эти глупые персонажи не вписываются в ваши маленькие маленькие 256 символов. 미안해! – Blindy