c++ - 使用 scanf 和 printf 会使程序无限循环,但通过替换 cin 和 cout 可以正常工作

标签 c++ c

我的问题是获取输入,直到用户输入测试值0,并且问题只能通过c语言解决,下面的代码通过使用scanfprintf变成无限循环 但如果用 C++ 编写相同的代码,它可以正常工作,没有问题,你能帮我解决我缺少的 C 程序吗?

#include <stdio.h>
#include <stdlib.h>
int main() {
    int click,test=1,count=0;
    char vote;
    scanf("%d",&test);
    while(test){
      int i=0;
      for(int i=0;i<test;i++){
      scanf("%c",&vote);
      scanf("%d",&click);
       printf("%c %d hi \n",vote,click);
}
      scanf("%d",&test);
    }
  //printf("%d\n",count);
    return 0;
}
my test case was
    2
    P 1
    P 2
    2
    P 2
    M -2
    0

在 C++ 中,我的输出与测试用例完全相同,但在 C 语言中,其 TLE 或输出限制超出

最佳答案

在处理 C 语言时,您应该始终检查运行时函数的返回值,这是避免出现类似错误的最佳方法。

scanf 返回它成功解析的项目数,如果失败则返回 0。

就我个人而言,我更喜欢使用 fgets() 从标准输入中读取,然后使用 sscanf 来解析缓冲区,这样您就可以(恕我直言)更好地控制进入程序的内容,而不是晦涩的 scanf 格式。使用 scanf 很容易犯错误,因为人们往往会忘记所有输入都已缓冲并且 scanf 从该缓冲区读取。

例如(仅目测编译)

int click = 0;
int test = 0;
char buffer[128];
char vote = 0;

do
{
  if ( fgets(buffer,sizeof(buffer),stdin) != NULL)
  {
    // read number of tests
    if (sscanf(buffer, "%d", &test) == 1)
    {
      for(int i=0; i < test; ++i)
      {
        if (fgets(buffer, sizeof(buffer), stdin) != NULL)
        {
          if (sscanf( buffer, "%c %d", &vote, &click) == 2)
          {
            printf( "%c %d hi \n", vote, click );
          }
          else
          {
            fprintf(stderr, "Invalid format encountered\n");
          }
        }
      }
    }
  }
}
while (test);

关于c++ - 使用 scanf 和 printf 会使程序无限循环,但通过替换 cin 和 cout 可以正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59590616/

相关文章:

c++ - 为 C++ 设置 Eclipse

c++ - 从返回类型为 'void' 的函数获取结果,而结果变量是输入参数之一 - C++

c++ - 星号之前还是之后?

在 Windows 7 上用 GCC 编译 :\mingw32\bin\ld. exe : cannot open output file a. exe

c - 在 C 应用程序中挂载带有 ntfs-3g 的设备

c++ - Opencv中的场景文本检测

c++ - 在堆栈已满并给出段错误之前,C/C++ 中的最大递归函数调用?

c++ - 根据一个 vector 中的值从两个 vector 中删除项目

c - 为什么这个字符串函数的最后一个字符是 "?"

c - 用 C 直接读写压缩文件