繁体   English   中英

C-使用scanf()时额外输入新行

[英]C - Extra new line input while using scanf()

对于使用Visual Studio的Console 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();

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

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

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

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

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

 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

我也遇到了这个问题,它是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()需要一个整数时,不会看到程序崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM