我的问题是,根据我输入的字符数量,我的代码循环基于加1。 例如,5个字符+ 1,我的代码循环6次。
我尝试过使用不同的替代品,比如getchar,scanf,但我坐在fgetc中,只是因为我更喜欢它。
问题代码是:
char decision = ' ';
printf("input data: ");
decision = fgetc(stdin);
while (checkChar(&decision) != 1)
{
printf("Please input a valid choice, 1 or 0\n");
decision = fgetc(stdin);
}
注意,checkChar只是检查char是1还是0,非常基本。 例如,如果我输入4则会导致: 请输入有效选项,1或0 请输入有效选项,1或0 请输入有效选项,1或0 请输入有效选项,1或0 请输入有效选项,1或0
我已经找到了使用的解决方案:
while(fgetc(stdin) != '\n')
但它并不完全是我称之为整洁的东西。我只是想知道是否有更好的方法?
感谢您的帮助!
答案 0 :(得分:3)
不太清楚你想要什么 - 听起来有点像 你想要一次真正读一个角色,但事实并非如此 在C ++中真的可能。 (你需要一个单独的库,比如 诅咒,为此。)键盘输入总是行 面向,所以你可能需要一次输入一行。 这种东西属于一个单独的函数,例如:
char
getDecision( std::istream& source, char const* legalDecisions )
{
char results = '\0';
std::string line;
while ( results == '\0' && std::getline( source, line) ) {
if ( ! line.empty()
&& std::strchr( legalDecisions, line[0] ) != NULL ) {
results = line[0];
}
}
return results;
}
在实践中,您可能希望在中进行更多处理 上面的循环。跳过前导空格,验证它 只有命令等,但上面应该给出 基本想法。 (假设标准的面向行的输入是 可以接受的。否则,你需要诅咒。)
答案 1 :(得分:1)
既然你说C ++,就这样做:
#include <string>
#include <iostream>
std::cout << "Input data: ";
char decision = '\0';
for (std::string d; std::getline(std::cin, d); )
{
if (d == "1" || d == "0") { decision = d[0]; break; }
std::cout << "Please input a valid choice ('0' or '1'): ";
}
if (d == '\0')
{
std::cout << "Premature end of input, aborting.\n";
std::exit(1);
}
答案 2 :(得分:1)
您可以使用scanf()
作为案例
int decision, c;
char tmp;
printf("input data: ");
while ((c = (scanf(" %d%c", &decision, &tmp)!=2 || !isspace(tmp)))
|| (decision<0 || decision>1))
{
printf("Please input a valid choice, 1 or 0\n", c);
if(c) scanf("%*[^\n]");
}
这一行:
if(c) scanf("%*[^\n]");
如果您在输入中输入了非数字字符,允许清除您的标准输入
答案 3 :(得分:0)
我已经搞砸了这一点,并且我已经想出如何正确地做到这一点,但是这种方法只有在你没有计划任何类型的输入重定向时才有效,因为你肯定会遇到问题。 基本上您想要使用字符串读取行,例如:char buffer [21]。 然后你想要使用fgets:fgets(buffer,21,stdin)将数据读入行。
然后在你完成之后直接有一个if语句,之后说if buffer [19]!='\ 0'表示:rewind(stdin); 〜这会清除stdin(基本上),但会导致重定向问题。谢谢!
之后使用:sscanf(buffer,“%c”,&amp; myChar)获取输入。
多数民众赞成,感谢所有人的帮助!这花了我太久了。和合。