0

Код с проблемным cin.get()

 #include <iostream>
using namespace std;

struct STR{ private: char* text; size_t size; public:

void set_text(char* text){
    this -&gt; text = text;
}

void get_text(){
    for(int i = 0; this-&gt;text[i] != '\0' ; ++i)
    cout &lt;&lt; this-&gt;text[i];
    cout &lt;&lt; endl;
}

void data(){
 cout &lt;&lt; &quot;Kol-symbol: &quot; &lt;&lt; this-&gt;size;   
}

STR(char* txt){
this -&gt; text = txt;
 size_t si = 0;
    for(int i = 0 ; this-&gt;text[i] != '\0' ; ++i){
        ++si;
    }
   this-&gt;size = si; 
}

STR(){
    char flag = '0';
    while(true){

        cout &lt;&lt; &quot;выделить место по умолчанию? (y or n): &quot;;
        cin &gt;&gt; flag;

        if(flag == 'y'){
        char* new_text = new char[2];
        this-&gt;size = 1;
        this-&gt;text = new_text;
        break;
        }
        else{

        cout &lt;&lt; &quot;Создать текст? (y or n): &quot;;
        cin &gt;&gt; flag;

            if(flag == 'y'){
                char ch = 0;
                int si = 20;
                int sch = 0;
                char* new_text2 = new char[si];
                while( ch != '\n' &amp;&amp; sch &lt; si){
                    cout &lt;&lt; &quot;@&quot; &lt;&lt; endl;
                    cin.get(ch);
                    new_text2[sch] = ch;
                    ++sch;
                }
                cout &lt;&lt; endl;
                for(int i = 0; i &lt; si ; i++){
                    cout &lt;&lt; new_text2[i];
                }
                break;
            }
            else{
                cout &lt;&lt; &quot;Выйти с программы? (y or n)&quot;;
                cin &gt;&gt; flag;
                if(flag == 'y'){
                    break;
                }
            }
        }
    }
}

};

int main(){ STR text_; return 0; }

Вот такой вот вывод : введите сюда описание изображения

А ожидалось что текст посимвольно запишется с потока в новый массив(если написать Hi!): введите сюда описание изображения

Почему так происходит ?

  • Вы после ввода y нажимали? А если нажимали, то где это \n находится? Что вы первым считываете в ch? – Harry Feb 04 '24 at 14:22
  • Да нажимал Enter , а \n по идее должен был хранится в ch после того как я бы ввел текст какой-то а потом нажал бы , и когда \n увидел бы компилятор в ch то тогда бы прервал цикл по условию. – Lolfox505 Feb 04 '24 at 22:24
  • @Harry Вопрос еще вот в чем... почему цикл стартует до того как я введу данные в cin.get(ch)? вот пример кода:char ch = 0; int si = 20; int sch = 0; char* new_text2 = new char[si]; while( ch != '\n' && sch < si && cin.get(ch)){ cout << "@" << endl; new_text2[sch] = ch; ++sch; } – Lolfox505 Feb 04 '24 at 22:26
  • У вас в буфере ввода хранится \nв ch - 0. Пошла проверка while. Первое условие (ch != '\n') истинно, значит, вторая проверка. Истинно. Значит, нужна третья, которая считывает из буфера хранящийся там \n. Пошло выполнение тела. После него опять проверка условия. Но теперь в ch хранится \n, так что первое условие ложно и цикл завершается. – Harry Feb 05 '24 at 10:11
  • @Harry Перед циклом я добавил 'cin.ignore()' и все заработало так как нужно (почистил буфер). Как Вы думаете это полноценно убирает проблему с циклом и вводом? или есть какие-то подводные камни? – Lolfox505 Feb 05 '24 at 22:03
  • В смысле ввода — все верно. В смысле действий программы — того, что там написано в теле цикла — не знаю, в том смысле, что я не знаю, чего именно вы добиваетесь, что должна делать программа... – Harry Feb 06 '24 at 07:23

0 Answers0