c - 无限提示循环问题

标签 c loops input

我的程序仅接受整数作为输入。如果 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; }

退出_成功;

here is the output after input of 'e e'

最佳答案

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

相关文章:

linux - 在 bash 的每个子目录中创建所有文件的列表

python - 使用 Tweepy 提取一周的推文

c - Linux 上 backtrace() 的替代方案,可以查找静态函数的符号

c - 奇数 PIL 逊相关系数结果

c# - 如何将一个 for 循环分成多个循环并使用线程运行它们以缩短运行时间?

html - 使输入的宽度因窗口调整大小而改变,并使用它之前的动态标签宽度

python - 从 system.in 中获取多行 Python 输入

c - 如何使用 libgit2 创建空提交?

c++ - C++中的运算符函数以及与之相关的编译错误

c - 为矩阵和用户输入动态分配内存