我编写了一个控制台程序,它从用户那里获取一些特定的字符输入来执行操作。程序要求输入,用户键入“i”表示插入或“r”表示删除等。问题是当用户键入多个字母时,程序表现得很奇怪。
char selection;
bool finish = false;
while (!finish){
print_menu();
cin >> selection;
finish = perform_operation(selection);
}
这就是我获取用户输入的方式。我想获得用户输入的第一个字符并忽略其余部分,并表现如此。我该怎么办?
注意:我不允许使用“string”类,但我可以使用每个str函数!
感谢您的帮助!
另一个案例:
如果我想获得大量字符怎么办?例如:用户输入一个10个字符的名称,但我只想获得前5个字符。我该怎么办?
答案 0 :(得分:6)
如果您想阅读一个字符,请阅读一个字符。
没有一个循环可以读取尽可能多的字符。
<Window.Resources>
<DataTemplate DataType="{x:Type vm:DossierViewModel}">
<local:Dossier />
</DataTemplate>
</Window.Resources>
...
<ContentControl x:Name="ContentControl" Content="{Binding SampleDossier}"/>
我已经为您的I / O操作添加了基本的错误检查。
答案 1 :(得分:1)
只获得一个可以使用的角色:
char selection;
cin >> selection; // input: abcd
cin.clear();
fflush(stdin);
printf("you entered the character: %c", selection); //selection='a'
// and nothing remained in input stream. you can safely `cin>>` again :]
您可以将此代码应用于现有代码。
为了获得特定数量的章程,您可以使用以下示例:
char* TakeNCharacterFromInput(int _count)
{
char *input = new char[_count+2];
std::cin.getline(input, _count+1);
cin.clear();
fflush(stdin);
return input;
}
int main(int args, char* argv[]) {
char *in1 = TakeNCharacterFromInput(5);//input:123456789 => in1:12345
char *in2 = TakeNCharacterFromInput(2);//input:123456789 => in2:12
char *in3 = TakeNCharacterFromInput(1);//input:123456789 => in3:1
delete[] in1;
delete[] in2;
delete[] in3;
}
答案 2 :(得分:1)
忽略除第一个角色之外的所有内容,直到下一个换行:
char selection;
bool finish = false;
while (!finish){
print_menu();
cin >> selection;
finish = perform_operation(selection);
cin.ignore(10000, '\n'); // Totally arbitrary large number.
}
答案 3 :(得分:0)
跳过始终重新打印菜单
print_menu();
然后使用等待ENTER的函数:
有几种方法,这里有一些可能的单行方法:
使用getch()(需要#include)。
使用getchar()(预期输入,需要#include)。
使用cin.get()(预期输入,需要#include)。
- 醇>
使用系统(&#34;暂停&#34;)(需要#include)。