1

Тема: Ввід стрічки довільної довжини c++

Поясніть, будь ласка, цей фрагмент коду, починаючи (*)

cout << "Enter a string:\n";
char c = getchar();
if (c == '\n')return 0;
//зчитування стрічки
int p;
p=cin.rdbuf()->in_avail(); // (*)
char *str = new char[p];
cin.getline(str, p);

при виводі код "з'їдає" перший символ, щоб ви порадили у вирішенні цієї проблеми?

2 Востаннє редагувалося koala (08.05.2017 15:46:26)

Re: Ввід стрічки довільної довжини c++

ny написав:

Поясніть, будь ласка, цей фрагмент коду, починаючи (*)

Ось тут дивитися не пробували?

ny написав:

при виводі код "з'їдає" перший символ

Нічого не з'їдає, все розкладає по відповідних змінних.
І, до речі, ніякого "виводу" (ви хотіли сказати "виведення"?), окрім першого рядку там немає.

Подякували: ostap34PHP, LoganRoss2

3 Востаннє редагувалося ny (08.05.2017 17:59:11)

Re: Ввід стрічки довільної довжини c++

ок, зробив я виведення
де поділася літера L в даному випадку?
і як цьому зарадити?

Post's attachments

Без імені.png 36.16 kb, 137 downloads since 2017-05-08 

4

Re: Ввід стрічки довільної довжини c++

ny написав:

ок, зробив я виведення
де поділася літера L в даному випадку?
і як цьому зарадити?

Може, досить вже на телепатів розраховувати? Я не знаю, як саме ви зробили виведення. Підозрюю, що ви самі виводите не все, що ввели.
І так, in_avail - це функція для досить специфічних завдань, як, власне, і весь буфер. Краще нею не користуйтеся.

Подякували: ostap34PHP, LoganRoss, ny3

5 Востаннє редагувалося LoganRoss (08.05.2017 20:51:31)

Re: Ввід стрічки довільної довжини c++

Потік вводу має свій буфер читання і щоб до нього звернутися використовується функція rdbuf(). А для того щоб дізнатися скільки символів в цьому буфері використовується функція in_avail(). Тож в наступному коді ми отримуємо кількість символів

p=cin.rdbuf()->in_avail(); 

Але такий спосіб досить сецифічний

koala написав:

in_avail - це функція для досить специфічних завдань, як, власне, і весь буфер

тому я б порекомендував щось таке:

numeric_limits<streamsize>::max()

Не телепат, але підозрюю, що перша буква не виводиться тому, що під неї просто не виділяється пам'ять, так як отримуючи кількість символів, ви не враховуєте перший символ.

char *str = new char[p+1];

Наведіть краще весь код, не думаю що він великий.

Because tomorrow may be gone.
Подякували: ny1

6

Re: Ввід стрічки довільної довжини c++

Я навіть телепатично розумію яким чином пропадає перша літера -- через те що бухвер має бути довший на один байт щоби містити кінцевий нуль, але ви щось таке пишете, що ні вам ні нам незрозуміле.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: ostap34PHP1

7

Re: Ввід стрічки довільної довжини c++

LoganRoss, 0xDADA11C7, ви знущаєтеся з людини чи не бачите? Я ж прямо написав - все розкладає по відповідних змінних. У множині.

Подякували: ostap34PHP, 0xDADA11C7, LoganRoss3

8

Re: Ввід стрічки довільної довжини c++

вже розібрався з даною проблемою)
дякую :)