我的程序仅接受int作为输入。如果2个输入不是整数或有2个以上的输入,则应打印“ Usange:子集nk(n和k是满足0 <= k <= n <= 100的整数)”并提示用户重试。如果我提供有效的输入,则程序可以正常运行,但如果输入错误,则会无限循环打印。我不知道为什么第一个'if'可以按我的方式工作,但是第二个'if'却不能。非常感谢您的任何帮助。
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; }
EXIT_SUCCESS;
答案 0 :(得分:0)
一个问题是%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;
}
此函数使用BUFSIZE
函数从特定的流中读取最多fgets
-1个字符(或到下一个换行符)。然后使用strtol
将该文本转换为整数值,并将其保存到tmp
。 chk
变量指向字符串中不是有效整数常量的部分 的第一个字符(即不是十进制数字的字符)。如果该字符为空格或零,则该字符串为有效整数。将该整数值分配给参数value
,并且该函数返回1表示成功。否则,value
保持不变,该函数返回0表示失败。
您可以通过主函数调用它,例如
if ( getint( &n, stdin ) && getint( &k, stdin ) && k < n && n < 100 )
现在,让我们谈谈您的程序结构...
您要进行两次scanf
通话,而不必这样做-您的if/else
块可以很简单
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...” );
}
答案 1 :(得分:-1)
您要两次调用scanf,因此要读取4个输入。 如果要将两个if都应用于“相同的scanf输出”,则需要将其保存。
示例:
a = scanf_f(..);
if(a == "expression1") { ... }
if(a == "expression2") { ... }