根据输入数+ 1停止fgetc重复循环?

时间:2013-04-03 08:58:39

标签: c loops

我的问题是,根据我输入的字符数量,我的代码循环基于加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')

但它并不完全是我称之为整洁的东西。我只是想知道是否有更好的方法?

感谢您的帮助!

4 个答案:

答案 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)获取输入。

多数民众赞成,感谢所有人的帮助!这花了我太久了。和合。