Я предполагаю создать такую программу, чтобы при вводе 'y'
он выполнял код в первом цикле do-while. однако, когда вводится 'y'
он просто пропускает кусок кодов!
Введите символы телефона:
2Продолжить (Y/y): y
Введите символы телефона:
Продолжить (Y/y):
В любом случае, я могу решить это без использования cin.ignore
поскольку он изменяет макет. Заранее спасибо!
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <iomanip>
#include <cstring>
const int MAX = 100;
using namespace std;
int getInt(char);
bool isValidChar(char);
int main()
{
int num;
int j = 0;
char name, conti;
char alpha[MAX];
do {
cout << "Enter a phone symbols: " << endl;
cin.getline(alpha, MAX);
// cin.ignore(100, '\n');
while (alpha[j] != '\0')
{
name = alpha[j];
if (isValidChar(name) == true)
{
num = getInt(name);
if (num == -1)
{
cout << "-";
}
else
{
cout << num;
}
}
else
{
cout << " - Invalid Char " << name << " found - rejected";
}
j++;
} // end while
cout << endl;
do {
cout << "\nContinue (Y/y): ";
cin >> conti;
cout << "\n" << endl;
conti = tolower(conti);
if (conti == 'n')
{
exit(0);
}
} while (conti != 'n' && conti != 'y');
} while (conti == 'y');
}
int getInt(char input)
{
int result;
char value;
value = tolower(input);
if ((value >= 'a' && value <= 'c'))
{
result = 2;
}
else if ((value >= 'd' && value <= 'f'))
{
result = 3;
}
else if ((value >= 'g' && value <= 'i'))
{
result = 4;
}
else if ((value >= 'j' && value <= 'l'))
{
result = 5;
}
else if ((value >= 'm' && value <= 'o'))
{
result = 6;
}
else if ((value >= 'p' && value <= 's'))
{
result = 7;
}
else if ((value >= 't' && value <= 'v'))
{
result = 8;
}
else if ((value >= 'w' && value <= 'z'))
{
result = 9;
}
else if (value == ' ')
{
result = -1;
}
return result;
}
bool isValidChar(char value)
{
if (isalpha(value) || value == ' ')
{
return true;
}
else
{
return false;
}
}
Что вы имеете в виду: есть ли в любом случае я могу решить это, не используя cin.ignore, поскольку он меняет макет. ?
Ваш макет задан, в основном по этой строке:
cout << "\nContinue (Y/y): ";
cin >> conti;
cout << "\n" << endl; // <-- this one
conti = tolower(conti);
Если вы его подавите, пустая строка не будет. В противном случае, если вы измените его на
cout << endl;
Только одна пустая строка.
std::string
.j
до0
после того, как внутренние ,while
петли, и добавленияss.ignore()
послеcin >> conti
. Вызовignore()
необходим, поскольку неформатированный ввод не сможет продолжаться, если в начале потока застряла новая строка. Вы можете найти свой рабочий код здесь.