所以我最初使用cin让用户输入一个字符。然后,如果此字符不是a,b或c,它将继续循环并输出错误消息。但是,如果用户输入多个字符,则会多次打印错误消息。所以现在我正在使用scanf接收一个字符串并检查长度是否为1.这是直接的,根本不工作。
string enterLetter() {
string n;
scanf("%s", &n);
return n;
}
void main() {
string ch = "";
cout << "Type a, b, or c: ";
while (ch != "a" && ch != "b" && ch != "c"){
while (ch.length() != 1) {
ch = enterLetter();
cout << ch.length();
}
ch = tolower((char)ch.c_str());
cout << "\n" << ch;
}
答案 0 :(得分:0)
您可以使用cin.getline()
读取由 Enter 键终止的整行用户输入。
char str[64];
cin.getline(str, sizeof(str));
如果strlen(str)
不等于1,则可能引发错误。否则,str[0]
可与a
,b
或c
进行比较。
如果你在循环中scanf
一个字符串,它将返回由空格(空格键或换行符号)终止的第一组字符。在下一次迭代中,它将读取下一个字符串,因此。如果用户输入"abc def\n"
之类的内容,则scanf将首先返回abc
,然后返回def
。如果您使用cin.getline(),则在第一次调用cin.getline()时将返回在换行符之前输入的所有字符,即"abc def"
。
答案 1 :(得分:0)
您不需要,也不应该使用string
。使用char
与scanf
效果更好。
int main() {
char ch;
cout << "Type a, b, or c: ";
scanf("%c", &ch);
while ((ch > 'C' && ch < 'a') || ch > 'c' || ch < 'A' ) {
if (ch >= 'A' && ch <= 'Z')
ch += ('a' - 'A');
cout << endl << ch;
cout << endl << "Enter a, b, or c: ";
scanf("%c", &ch);
}
}
这使用scanf
来获取char ch
。它在char
不是a, b, c
或A, B, C
时循环(因为您似乎想要一个大写的用例)。如果char
为大写,则会转换为小写,然后输出char
。
答案 2 :(得分:0)
您不能像scanf("%s")
一样使用std::string
。 scanf("%s")
预计会预先分配char[]
。如果您想阅读std::string
,请改为使用std::cin.operator>>()
或std::getline()
:
char enterLetter() {
string n;
do {
std::getline(std::cin, n);
}
while (n.length() != 1);
return n[0];
}
int main() {
char ch;
do {
std::cout << "Type a, b, or c: ";
ch = enterLetter();
}
while ((ch != 'a') && (ch != 'b') && (ch != 'c'));
std::cout << ch;
return 0;
}