Некрасивая ошибка сегментации с getline () в C ++ - PullRequest
0 голосов
/ 11 января 2020

)

На занятиях я пишу простой код на C ++ для упражнения. Там мне нужна функция getline () для некоторых пробелов, включая ввод текста пользователем. Но вместо ввода пользователя я получаю ошибку сегментации.

Вот минимизированный пример:

#include <iostream>
#include <string>
#include <ctime>

/**
 * Shows main menu.
 *
 * @version 1.0.0
 *
 * @return Returns selected option.
 */
unsigned int showMenu() {
    unsigned int result;
    printf("\n\nSimple transfer\n===============\n\n");
    printf("Options:\n-----------\n");
    printf(" 1: Receive\n");
    printf(" 2: Send\n");
    printf("Enter any other number to exit.\n\n");
    printf("?: ");
    scanf("%u", &result);
    return result;
}

// Some functions.

/**
 * Entry point.
 *
 * @version 1.2.0
 *
 * @return Returns result code.
 */
int main() {
    // Initialization.
    setbuf(stdout, NULL);
    bool expectData;
    std::string inMessage, outMessage;
    // Run.
    while (true) {
        switch (showMenu()) {
            // Receiving mode.
            case 1:
                // Some code.
                std::cout << "Received.\n";
                break;

            // Sending mode.
            case 2:
                outMessage = "Dies ist eine Testnachricht.";
                getline(std::cin, outMessage);
                printf("Sending: ");
                for (unsigned int i = 0; i <= outMessage.length() -1; i++) {
                    // Some code.
                    printf("%c", outMessage[i]);
                }
                printf("\n");
                break;

            // Exit.
            default:
                printf("Bye.\n");
                return 0;
        }
    }
}

Кто-нибудь знает причину и как ее исправить? : -)

1 Ответ

3 голосов
/ 11 января 2020

Вы должны использовать:

std::cin.ignore();

Перед вашим getline(...);, потому что он читает символ новой строки, вызванный нажатием клавиши ввода, вместо того, чтобы позволить вам набрать сообщение. См. этот вопрос для получения более подробной информации.

Вы получаете Expression: string subscript out of range исключение, потому что вы пытаетесь вставить здесь пустую строку: printf("%c", outMessage[i]);

РЕДАКТИРОВАТЬ: Как @Johnny Mopp указал в комментарии, outMessage.length() возвращает тип size_t, который является беззнаковым типом. Затем из 0 без знака вы вычитаете 1, переполняя его до «большого» числа, поэтому for l oop пытается вывести очень длинную несуществующую строку.

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