0

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

4 回答 4

3

不太清楚你想要什么——听起来有点像你想一次真正地读取一个字符,这在 C++ 中是不可能的。(为此,您需要一个单独的库,例如 curses。)来自键盘的输入始终是面向行的,因此您可能需要一次输入一行。这种事情属于一个单独的功能,例如:

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;
}

在实践中,您可能希望在上面的循环中进行更多处理。跳过前导空格,验证是否只有命令等。但上面应该给出基本的想法。(假设标准的面向行的输入是可以接受的。否则,你需要curses。)

于 2013-04-03T09:21:26.283 回答
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);
}
于 2013-04-03T09:13:56.283 回答
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]");

如果您在输入中输入了非数字字符,则允许清理您的标准输入

于 2013-04-03T09:17:43.560 回答
0

我已经搞砸了很多,我已经想出了如何体面地做到这一点,但是这种方法只有在你不打算进行任何类型的输入重定向时才有效,因为你肯定会遇到问题。基本上您想使用字符串读取该行,例如:char buffer[21]。然后,您将要使用 fgets 将数据读入该行: fgets(buffer, 21, stdin)。

然后在你完成之后直接有一个 if 语句说 if buffer[19] != '\0' that do: rewind(stdin); ~ 这会清除标准输入(基本上),但会导致重定向问题。谢谢!

之后使用: sscanf(buffer, "%c", &myChar) 来获取输入。

差不多就这些了,谢谢大家的帮助!这花了我的时间太长了。呵呵。

于 2013-04-03T11:30:29.083 回答