无限提示循环问题

时间:2019-07-07 01:14:15

标签: c loops input

我的程序仅接受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;

here is the output after input of 'e e'

2 个答案:

答案 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将该文本转换为整数值,并将其保存到tmpchk变量指向字符串中不是有效整数常量的部分 的第一个字符(即不是十进制数字的字符)。如果该字符为空格或零,则该字符串为有效整数。将该整数值分配给参数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") { ... }