【问题标题】:C - Extra new line input while using scanf()C - 使用 scanf() 时额外的新行输入
【发布时间】:2015-05-23 12:56:13
【问题描述】:

我有以下使用 Visual Studio 的控制台 Win32 应用程序的“C”代码。它检查参数并直接调用函数或使用scanf() 获取输入,然后调用该函数。如果我提供命令行参数,该程序可以完美运行,但是当我使用scanf() 提供输入时,它可能会添加一个我想避免的额外换行符。

我知道它会这样做,因为当我给出参数时,在显示“按 ENTER 退出...”之后,它会等待 ENTER 输入,但在使用 scanf() 时不会这样做。如果我也使用scanf_s(),就会出现这个问题。

感谢您对此的帮助。

问候,

沙希德

    unsigned long int ipv;
    unsigned int yrs;
    float acr, acl, asp, irr, psp;

        if(argc<=1) {
            //get inputs
            printf("Initial value of portfolio: "); scanf("%lu", &ipv);
            printf("Average cash rate: "); scanf("%f", &acr);
            printf("Average cost of living: "); scanf("%f", &acl);
            printf("Average return for share portfolio: "); scanf("%f", &asp);
            printf("Initial removal for living expenses: "); scanf("%f", &irr);
            printf("Percentage of shares in initial portfolio: "); scanf("%f", &psp);
            printf("Years for the analysis: "); scanf("%u", &yrs);

            //simulate the investment with given inputs
            simulate(ipv, acr, acl, asp, irr, psp, yrs);
        } else {
            if (argc == 8) {
                //invsim 1000000 0.05 0.036 0.12 0.08 0.5 20

                //simulate the investment with given inputs
                simulate(atol(argv[1]), (float)atof(argv[2]), (float)atof(argv[3]), (float)atof(argv[4]), (float)atof(argv[5]), (float)atof(argv[6]), atoi(argv[7]));
            } else {
                printf("Please enter arguments as...\ninvsim.exe ipv acr acl asp irr psp yrs");
            }
        }

printf("\n\nPress ENTER to quit...");
getchar();

【问题讨论】:

  • 我喜欢 Sourav 和 VolAnd 的简单解决方案。前者在前,后者稍微完整。选择答案并关闭它的正确逻辑是什么。

标签: c++ c visual-studio scanf


【解决方案1】:

要改进您的“暂停”功能,请使用以下更新:

 printf("\n\nPress ENTER to quit...");
 while( getchar() != '\n' ); // clear the input buffer after reading numbers with scanf
 getchar();  // wait for new input

编辑:

考虑到你程序的if-else,将建议的while循环移到上面:

 printf("Years for the analysis: "); 
 scanf("%u", &yrs);
 while( getchar() != '\n' ); // clear the input buffer

【讨论】:

  • 对于第一种方法,您必须在通过命令行提供值时按两次 ENTER,不是吗?
【解决方案2】:

我知道它会这样做,因为当我给出参数时,在显示“Press ENTER to quit...”之后,它会等待 ENTER 输入,但在使用 scanf() 时不会这样做。

这是正确的行为,不是吗?当您通过命令行提供参数时,您不会按任何 ENTER 键。因此,输入缓冲区中没有\n。因此,getchar() 将等待来自stdin 的输入。

但是,当您使用scanf() 输入值时,您在输入后按ENTER 键。对于数值,会扫描数值,但 \n(通过点击 ENTER 生成)保留在输入缓冲区中,以供下一个 getchar() 读取。因此,您的代码不会等待

解决方法:在scanf()部分代码的末尾添加一个getchar();,即在if块的末尾。

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,它是 C 语言中最令人沮丧的部分之一。我不记得我到底做了什么,但我记得我最终编写了一个小库来处理每种类型的输入,即、字符串、数字等。

    IIRC,我刚刚使用 getline() 并使用 atoi() 和 ctype.h 中的其他转换函数将字符串解析为我需要的类型;我检查了字符串的长度,如果它是 1(?),唯一的方法是缓冲区中已经有新行,所以我再次调用 getline()。

    通过这种方式,我可以编写一次输入验证,并使用它一百万次。所以我的代码最终看起来像:

    do {
          get_int("Enter an integer:", &myInt);//returns -123456789 for invalid input, or such
     } while ( myInt <= 0 )//assuming you only wanted positive input 
    

    当你输入一个字符串并且 scanf() 需要一个整数时,这也有一个重要的好处,那就是看不到你的程序崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多