# sed script to change "foo" to "bar" only on the first occurrence 1{x;s/^/first/;x;} 1,/foo/{x;/first/s///;x;s/foo/bar/;} #---end of script---
или, если хотите: Примечание редактора: работает только с GNU
sed
.sed '0,/RE/s//to_that/' file
operator>>
не гарантируется вывод значащего целочисленного значения в случае сбоя, но вы не проверяете сбой перед оценкой __userChoice
, и то, как ваши if
структурированы, проверка else (!cin)
никогда не будет быть достигнутым. Но даже если operator>>
успешно, вы не проверяете, вводил ли пользователь больше, чем просто целое число.
Чтобы сделать то, что вы просите, вы должны прочитать из std::cin
в std::string
сначала используя std::getline()
, а затем использовать std::istringstream
или [1115 ] std:stoi()
(или эквивалентный) для преобразования string
в int
с проверкой ошибок.
Например:
bool strToInt(const std::string &s, int &value)
{
std::istringstream iss(s);
return (iss >> value) && iss.eof();
// Or:
std::size_t pos;
try {
value = std::stoi(input, &pos);
}
catch (const std::exception &) {
return false;
}
return (pos == input.size());
}
...
std::string input;
int userChoice;
std::cout << "Please select: ";
std::getline(std::cin, input);
if (strToInt(input, userChoice))
{
if (userChoice > 0 && userChoice < 5)
{
std::cout << "You selected menu item " << userChoice <<". Processing... Done!\n";
}
else if (userChoice == 5)
{
Finalization(); //call exit
}
else
{
std::cout << "Please select a number from 1 to 5.\n";
}
}
else
{
std::cout << "Invalid input, please input an integer number.\n";
}