C ++ GetLine или CIN, не принимая строку с пробелами, я искал Google, и я все еще тупил!
Вопрос
Прежде всего, благодаря всем, кто помогает мне, это очень ценится!
Я пытаюсь хранить строку с пробелами и специальными персонажами в 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")
. - Дайте нам знать, как это идет тогда.