Как завершить двумерный массив символов, когда строка '\ 0'? - PullRequest
1 голос
/ 25 октября 2019

У меня есть программа, которая запрашивает у пользователя строковые входы, которые хранятся в массиве двумерных символов. Программа должна перестать запрашивать ввод, когда вводится 20 строк или когда пользователь нажимает дважды, введите.

По какой-то причине, независимо от того, что я делаю, программа будет отображать все пустые строки, даже если пользователь незаселил их. Как я могу остановить это?

int main()
{
    char sentences[20][81] = { '\0' };

    cout << "Enter up to 20 sentences - when done, Press ENTER: ";
    input(sentences);

    for (int i = 0; i < 20; i++)
    {
        if (sentences[i] == '\0' || sentences[i] == "\n")
            break;
        else
        {
            cout << "\nHere is sentence " << i + 1 << ": " << endl << sentences[i] << endl;
            menu(sentences[i]);
        }

    }

    cout << "\nPress any key to continue...";
    _getch();
    return 0;
}

void input(char str[20][81])
{
    for (int i = 0; i < 20; i++)
    {
        cin.getline(str[i], 81, '\n');
        if (str[i][0] == '\0')
            break;
    }
}

Нет сообщений об ошибках, и я ожидаю, что проверка здесь

if (sentences[i] == '\0' || sentences[i] == "\n"
    break;

должна завершить программу при обнаружении пустой c-строки,почему этого не происходит?

1 Ответ

1 голос
/ 25 октября 2019

Эта проверка здесь неверна:

if (sentences[i] == '\0' || sentences[i] == "\n")

Вы сравниваете sentences[i] (a char*) с '\0' (a char). Часть sentences[i] == "\n" совершенно неверна - просто избавьтесь от этого. Ваша проверка должна выглядеть следующим образом:

if (sentences[i][0] == '\0' )

Но я бы действительно рекомендовал использовать std::vector<std::string> вместо этой многомерной строковой конструкции в стиле c. Вы можете просто использовать push_back, чтобы добавить строку к вектору и цикл for на основе диапазона, чтобы пройти через вектор и распечатать его результаты. Вы можете сделать это с помощью функции input следующим образом:

void input(std::vector<std::string> &sentences)
{
    for (int i = 0; i < 20; i++)
    {
        std::string s;
        std::getline(std::cin, s);
        if (s.empty())
            break;
        sentences.push_back(s);
    }
}

А затем функция main выглядит следующим образом:

int main()
{
    std::vector<std::string> sentences;

    std::cout << "Enter up to 20 sentences - when done, Press ENTER: " << std::endl;
    input(sentences);

    for (int i = 0; i < sentences.size(); i++)
        std::cout << "Here is sentence " << i + 1 << ": " << std::endl << sentences[i] << std::endl;

    std::cout << "Press any key to continue...";

    //getch();
    return 0;
}

Таким образом, вам даже не понадобитсяжестко запрограммированный предел 20 предложений, вы можете просто удалить его и использовать вместо него цикл while (true).

...