C ++ GetLine или CIN, не принимая строку с пробелами, я искал Google, и я все еще тупил!

StackOverflow https://stackoverflow.com/questions/3146351

  •  01-10-2019
  •  | 
  •  

Вопрос

Прежде всего, благодаря всем, кто помогает мне, это очень ценится!

Я пытаюсь хранить строку с пробелами и специальными персонажами в MessageToAdd.

я использую getline (cin,MessageToAdd); И я также пробовал cin >> MessageToAdd;.

Я так тупик! Когда я ввод ввод образца

Тестовое задание

Все работает как предназначено. Однако, если я использовал

Тестовый тест теста

Вся консоль просто быстро мигает, пока не нажимаю Ctrl.Слияние.

Мой стиль ввода переменных наверху мне сказали, устарело. Пожалуйста, прости меня, так как я все еще преподаю себя, и это просто сила привычки. Я буду изменять свой стиль вскоре после того, как я решил это :)

void AddMessage() {
    ifstream myReadFile;
    string str;
    string MessageToAdd;
    string myMessages[10];
    int i; // of course my famous i
    static string rowHtmlCloseTags;
    static string rowHtmlOpenTags;
    string replacement;

    myReadFile.open("C:\\Users\\Andrews\\Documents\\Visual Studio 2010\\Projects\\computerclass\\Debug\\outages.htm",ios::in);
    i = 0; //the start of my array
    rowHtmlCloseTags = "</b></td>"; // value that I want to replace with nothing
    rowHtmlOpenTags = "<td><b>";

    if(!myReadFile) // is there any error?
    {
        cout << "Error opening the file! Aborting…\n";
        exit(1);
    }

    if (myReadFile.is_open())
    {
        cout << endl;

        while (!myReadFile.eof())
        {
            getline(myReadFile, str);

            if (str == "<tr>")
            {            
                getline(myReadFile, str); //get the next line cause thats where the <td><b>Outage Message</b></td> is.
                size_t foundIndex = str.find(rowHtmlCloseTags); //does the sought string exist in this this line?
                if (foundIndex != str.npos) //if not no position
                    str.replace(foundIndex, rowHtmlCloseTags.size(), replacement); //replace the string
                else
                    std::cout << "Oops.. didn't find " << rowHtmlCloseTags << std::endl; //else throw a bitch

                foundIndex = str.find(rowHtmlOpenTags); //does the sought string exist in this this line?
                if (foundIndex != str.npos) //if not no position
                    str.replace(foundIndex, rowHtmlOpenTags.size(), replacement); //replace the string
                else
                    std::cout << "Oops.. didn't find " << rowHtmlOpenTags << std::endl; //else throw a bitch

                myMessages[i]=str;
                i++;
            }
        }
    }
    system("cls");
    i=0;
    while (i < 10)
    {
        cout << i << ") " << myMessages[i] << endl;
        i++;
        if (myMessages[i]=="")
        {
            break;
        }
    }
    myReadFile.close();
    cout << endl;
    cout << endl;
    cout << "Enter the message you would like to see on the reader board.\n";
    cout << "Or enter 911 to go back to the main menu: ";
    cin.ignore(1080);
    getline (cin,MessageToAdd);

    if (str == "911") //go back to the main menu
    {
        system("cls");
        mainMenu();
    }
    else //insert the message into a blank spot in the array
    {
        i=0;
        while (i < 10)
        {
            if (myMessages[i].empty())
            {
                myMessages[i]=MessageToAdd;
                break;
            }
            else
            {
                i++;
            }
        }
    }

    //now rebuild the htm file with the new array
    CreateHtmlFile(myMessages);
}
Это было полезно?

Решение

Я скажу вам одну вещь, которая сразу не так с вашим кодом, а не ваша конкретная проблема, кроме волосатого тем, что тем не менее.

Я предполагаю, что ваш mainMenu() Функция вызывает это. В этом случае вы, кажется, под неправильным прицелом:

if (str == "911") //go back to the main menu
{
       system("cls");
       mainMenu();
}

вернется в ваше меню. Так и будет нет сделай это. Что это будет делать, это позвонить в ваш главный код меню Afore Afore и в конце концов у вас закончится пространство стека.

Я подозреваю, что то, что вы должны делать, у них есть цикл в mainMenu() и этот код выше должен просто использовать return; а не звонить mainMenu() рекурсивно.

Что и тот факт, что я думаю, что вы должны сравнивать MessageToAdd против "911" скорее, чем str.


Еще одна вещь, которую я бы сделал, было бы поставить немного временного кода отладки в:

cout << "DEBUG A\n";
i=0;
while (i < 10)
{
    cout << "DEBUG B " << i << "\n";
    if (myMessages[i].empty())
    {
        cout << "DEBUG C\n";
        myMessages[i]=MessageToAdd;
        break;
    }
    else
    {
        i++;
        cout << "DEBUG D " << i << "\n";
    }
    cout << "DEBUG E\n";
}
cout << "DEBUG F\n";

и посмотрите, что напечатано. Конечно, вы могли бы проследить казнь в отладчике, но это потребует от вас сделать работу самостоятельно. Если вы просто опубликуете вывод (первые 100 строк, если он огромный), то мы, вероятно, можем сказать вам, что не так легко.


На самом деле, я думаю, что ваша проблема cin.ignore. Отказ Когда я бегу свой код, ничто не работает, ни один Test ни Test Test Test. Отказ Это потому, что он игнорирует первые 1080 символов, которые я пытаюсь ввести. Доказательство можно увидеть, когда вы меняете эти утверждения:

cin.ignore(1);
getline (cin,MessageToAdd);
cout << MessageToAdd << "\n";

и вы получаете est вывод при входе test.

Выводить ignore линия и попробуйте снова. Я не уверен этого, так как вы, кажется, указываете, что Test Работает, но я не вижу это как правильное.


Так вот вот что вам нужно сделать (в минимуму минимум):

  • избавиться от cin.ignore Всего.
  • использовать return скорее, чем mainMenu().
  • использовать if (MessageToAdd == "911") вместо if (str == "911").
  • Дайте нам знать, как это идет тогда.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top