我的程序仅接受整数作为输入。如果 2 个输入不是整数或者有超过 2 个输入,则应该打印“Usange: Subset n k (n and k are ints Satsatis 0<=k<=n<=100)”并提示用户重试。如果我提供有效的输入,则程序可以正常工作,但如果输入错误,它将以无限循环打印。我不知道为什么第一个“如果”按我想要的方式工作,但第二个“如果”却不行。非常感谢任何帮助,谢谢。
int main() {
int n;
int k;
int i = 1;
int B[MAX_SIZE + 1];
try_again:
printf("subsets ");
if (( scanf_s("%d %d", &n, &k) == 2) && ((k < n) && (n < 100))) {
printSubsets(B, n, k, i);
goto try_again;
}
if ((scanf_s("%d %d", &n, &k) != 2) || ((k > n) || (n > 100))) {
printf("\n");
printf("Usange: Subset n k (n and k are ints satisfying 0<=k<=n<=100)\n");
goto try_again;
}
else { goto try_again; }
退出_成功;
最佳答案
一个问题是 %d
不会消耗任何不属于有效十进制整数常量的内容 - 如果您输入非数字字符进行输入,%d
永远不会将其从输入流中删除,并且您的代码将在该字符上不断失败,从而导致无限循环。
如果您不能保证您的输入行为良好,那么您应该以文本形式读取所有内容并手动解析它。例如:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define BUFSIZE 12 // 10 digits plus sign plus terminator
int getint( int *value, FILE stream)
{
char inbuf[BUFSIZE] = {0};
if ( fgets( inbuf, sizeof inbuf, stream ) )
{
char *chk;
int tmp = strtol( inbuf, &chk, 10 );
if ( isspace( *chk ) || *chk == 0 )
{
*value = tmp;
return 1;
}
}
return 0;
}
此函数使用 fgets
函数从指定的流中读取最多 BUFSIZE
-1 个字符(或下一个换行符)。然后使用 strtol
将该文本转换为整数值,并将其保存到 tmp
。 chk
变量指向字符串中不属于有效整数常量的第一个字符(即不是十进制数字字符)。如果该字符是空格或零,则该字符串是有效整数。该整数值被分配给参数 value
,函数返回 1 表示成功。否则,value
保持不变,并且函数返回 0 表示失败。
您可以从主函数中调用它,例如
if ( getint( &n, stdin ) && getint( &k, stdin ) && k < n && n < 100 )
现在,让我们谈谈您的程序结构......
您将 scanf
调用两次,但您不需要这样做 - 您的 if/else
block 可以简单地是
if ( getint( &n, stdin ) && getint( &k, stdin ) && k < n && n < 100 )
printSubsets(...);
else
printf( “Usage...” );
此外,虽然在某些情况下goto
可能是正确的答案,但这不是其中之一。相反,请使用 for(;;)
循环进行迭代,直到成功运行 printSubsets
:
for (;;)
{
printf( “subsets: ” );
if ( getint( &n, stdin ) && getint( &k, stdin ) && k < n && n < 100 )
{
printSubsets(...);
break;
}
else
printf( “Usage...” );
}
关于c - 无限提示循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56918731/