Неправильный Enter

Помогите пожалуйста.

Задача. Введенная пользователем строка символов сохраняется в целочисленный массив в виде кодов ASCII. Окончание ввода по нажатию Enter. После чего данные выводятся на экран через многоточие.

Проблема. Enter вместо того, чтобы как положено, перевести курсор на новую строку, ставит его в начало строки и стирает ранее написанное.
То, что виноват именно он — выдает то, что если в цикле for изменить условие на (//; i < arr.size(); //), чтобы последний элемент массива тоже печатался, курсор опять таки встает в начало строки.

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

#include <iostream>
#include <vector>
#include <conio.h>

using std::cout;
using std::vector;

int main()
{
    vector<int> arr;
    int qu = 0;

    do
    {
        arr.push_back(static_cast<int> (_getch())); // нажатые клавиши сохраняются в виде кодов ASCII
        cout << static_cast<char> (arr[qu]); // введенный символ выводится на экран
        qu++;
    } 
    while (arr[qu-1] != 13); // пока не нажмешь Enter (код ASCII = 13)

    // вывод полученных значений, снова в символьном виде через многоточие.
    for (int i = 0; i < arr.size()-1; i++) 
        cout << static_cast<char> (arr[i]) << "...";

    cout << "\n\n";
    system("pause");
}

Прикол в том, что ты выводишь символ CR на экран, он и вызывает такой побочный эффект. CR, он же 13 символ в таблице ASCII, он же «\r» — на самом деле называется carriage return, его часто используют в консольных приложениях для демонстрирования процесса загрузки чего-либо, потому что он стирает строку, позволяя «обновлять» на ее месте информацию. Все, что нужно, чтобы твоя задумка работала, просто не выводить этот символ, например вот этим костылем.

#include <iostream>
#include <vector>
#include <conio.h>

using std::cout;
using std::vector;

int main()
{
    vector<int> arr;
    int qu = 0;

    do
    {
        arr.push_back(static_cast<int> (_getch())); // нажатые клавиши сохраняются в виде кодов ASCII
        if (arr[qu] != 13)
            cout << static_cast<char> (arr[qu]); // введенный символ выводится на экран
        qu++;
    } while (arr[qu - 1] != 13); // пока не нажмешь Enter (код ASCII = 13)

                               // вывод полученных значений, снова в символьном виде через многоточие.
    for (int i = 0; i < arr.size() - 1; i++)
        cout << static_cast<char> (arr[i]) << "...";

    cout << "\n\n";
    system("pause");
}

P.S. ты делаешь много лишних манипуляций, например делаешь cast int к int или считаешь лишний раз индексы для вектора, хотя и без этого можно обойтись.

Slonopotam, читаем внимательно условие задачи: Введенная пользователем строка символов сохраняется в целочисленный массив в виде кодов ASCII. Окончание ввода по нажатию Enter. Это полностью укладывается в последовательность действий: (1) ввести строку и (2) сохранить строку в целочисленый массив в виде кодов ASCII. Т.е. получить от пользователя ввод в виде string, а потом содержимое этой переменной перевести в массив типа int. Если принять во внимание, что по переменной типа string можно совершенно спокойно итерировать, и то, что символы в переменной типа string сохраняются в коде ASCII, задача становится тривиальной.

А символ Enter вообще не надо сохранять. Это ограничитель.

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

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.