0

我没有太多时间,而且很多关于stdin这个阶段的问题只是提出了比它回答的问题多得多的问题。我希望测试通过多个scanf.

如果我这样做:

char inputChar;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;

if(scanf("%c %d %lf",&inputChar,&inputInt,&inputDec) == 3) {
    ...
}
else if(scanf("%c %d %s",&inputChar,&inputInt,&inputChars) == 3) {
    ...
}
else if(scanf("%c %d",&inputChar,&inputInt) == 2) {
    ...
}
else if(scanf("%c",&inputChar) == 1) {
    ...
}
else {
    ...
}

然后键入一个字符并按 Enter,控制台会等到我输入另一个值,然后再评估是否匹配。

更新

这似乎工作正常,除了它希望您的输入在使用时完美。如果用户在按 Enter 之前键入aa然后将其更改为,则它与第 4 次评估匹配。a 10这是错误的,原因有两个:

  1. 因为如果正确捕获输入,它应该匹配第三个;
  2. 因为如果没有aa应该被过滤到第 5 次评估中。

修改后的代码:

char input[50] = { NULL };

char inputChar = NULL;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;

printf("Input String:\n>");

fgets(input,sizeof(input),stdin);

if(sscanf(input,"%c%d %lf",&inputChar,&inputInt,&inputDec) == 3) { }
else if(sscanf(input,"%c%d%s",&inputChar,&inputInt,&inputChars) == 3) { }
else if(sscanf(input,"%c%d",&inputChar,&inputInt) == 2) { }
else if(sscanf(input,"%c",&inputChar) == 1) { }
else { }

做这样的事情表明退格没有被过滤掉:

for(int i=0;i<50;i++) {
    if(input[i] == (char) 10) { break; }
    printf("\n%c %d",(char) input[i],(int) input[i]);
}

所以它似乎fgets不在画面中。

4

3 回答 3

2

语句按顺序执行。所以这是第一个scanf等待更多输入的调用。如果输入与第一次调用不匹配,则下一次scanf调用将重新开始,等待输入。等等。

相反,您应该使用fgets读取整行,然后使用sscanf就行。

于 2013-02-26T06:33:15.120 回答
1

请解释“清除输入缓冲区”是什么意思。你的意思是 _flushall 在我的击键发生之前擦除它们吗?它怎么能做到这一点?也许您的意思是您已经从该行中读取了您需要的数据,而您并不关心该行的其余部分。在这种情况下,我假设您希望“读取并丢弃直到并包括下一个换行符的所有字符”。我有一个可移植的机制来做到这一点:

for (int c = getchar(); c >= 0 && c != '\n'; c = getchar());

您可能还希望阅读此相关答案

编辑:我刚刚想到你想要的行为可能表达如下:

char inputChar;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;
int x = scanf("%c%d", &inputChar, &inputInt);

if (x == 2 && scanf("%lf",&inputDec) == 1) {
    ...
}
else if (x == 2 && scanf("%14s", inputChars) == 1) {
    ...
}
else {
    ...
}
于 2013-02-26T07:31:13.803 回答
0

可能不是最好的方法,但它确实有效。

使用iostream库运行getline(std::cin,input);捕获输入,std::string input然后sscanfinput.c_str().

于 2013-03-01T15:10:09.230 回答