首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:在本例中跳过printf和scanf语句。

C:在本例中跳过printf和scanf语句。
EN

Stack Overflow用户
提问于 2022-10-05 14:40:18
回答 3查看 63关注 0票数 1

我想制作2行计算器程序,但是在第一个printf之后,它跳过了第二个语句。

代码语言:javascript
复制
#include <stdio.h>
int main ()
{
    int a,b,c,d,abcd;
    int e,f,g,h,efgh;
    
    printf("1. "); 
    scanf("(%d+%d)x(%d-%d)",&a,&b,&c,&d);
    printf("2. "); 
    scanf("(%d+%d)x(%d-%d)",&e,&f,&g,&h);
    
    abcd=(a+b)*(c-d);
    efgh=(e+f)*(g-h);
    
    printf("%d %d %d",abcd,efgh);
    return 0;
}

我想让这个节目像这样:

代码语言:javascript
复制
input
 1. (1+2)x(3-4)
 2. (5+6)x(7-8)
代码语言:javascript
复制
output
-3 -11
EN

回答 3

Stack Overflow用户

发布于 2022-10-05 14:59:10

我强烈建议您使用fgets读取一行输入,然后使用sscanf解析所需的信息。您还需要检查sscanf的返回值,以确保读取了所有四个值。在这种情况下,我成功地输入了打破无限循环(for (;;) { ... })所需的输入。

还请注意,所有变量都不需要在函数开始时声明。相反,可以在其使用点声明和初始化它们。在这个场景中,我在稍后的abcd中声明了mainefgh

代码语言:javascript
复制
#include <stdio.h>

#define LINE_LEN 256

int main ()
{
    int a, b, c, d;
    int e, f, g, h;

    char line[LINE_LEN] = {0};

    for (;;) {
        printf("1. ");
        fgets(line, LINE_LEN, stdin);
        if (sscanf(line, "(%d+%d)x(%d-%d)", &a, &b, &c, &d) == 4)
            break;
 
        fprintf(stderr, "Bad input. Try again.");
    }  

    for (;;) {
        printf("1. ");
        fgets(line, LINE_LEN, stdin);
        if (sscanf(line, "(%d+%d)x(%d-%d)", &e, &f, &g, &h) == 4)
            break;
 
        fprintf(stderr, "Bad input. Try again.");
    } 

    int abcd = (a + b) * (c - d);
    int efgh = (e + f) * (g - h);

    printf("%d\n", abcd);
    printf("%d\n", efgh);

    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2022-10-05 15:03:48

通过一些建议,here,我复制了从C中的stdin中读取的函数,并修改了您的示例。这是处理来自C应用程序的stdin的一种安全方法。

此外,我尝试了您的代码,并且我认为错误的是,一些换行符在stdin中被“困住”,因此第二个scanf会在您编写任何东西之前返回。所以这个解决方案。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

#define OK       0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
    int ch, extra;

    // Get line with buffer overrun protection.
    if (prmpt != NULL) {
        printf ("%s", prmpt);
        fflush (stdout);
    }
    if (fgets (buff, sz, stdin) == NULL)
        return NO_INPUT;

    // If it was too long, there'll be no newline. In that case, we flush
    // to end of line so that excess doesn't affect the next call.
    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            extra = 1;
        return (extra == 1) ? TOO_LONG : OK;
    }

    // Otherwise remove newline and give string back to caller.
    buff[strlen(buff)-1] = '\0';
    return OK;
}

int main ()
{
    int a,b,c,d,abcd;
    int e,f,g,h,efgh;
    
    int rc;
    char buff[20];
    
    rc = getLine ("1. ", buff, sizeof(buff));
    if (rc == NO_INPUT) {
        // Extra NL since my system doesn't output that on EOF.
        printf ("\nNo input\n");
        return 1;
    }

    if (rc == TOO_LONG) {
        printf ("Input too long [%s]\n", buff);
        return 1;
    }
    
    sscanf(buff, "(%d+%d)x(%d-%d)",&a,&b,&c,&d);
    
    rc = getLine ("2. ", buff, sizeof(buff));
    if (rc == NO_INPUT) {
        // Extra NL since my system doesn't output that on EOF.
        printf ("\nNo input\n");
        return 1;
    }

    if (rc == TOO_LONG) {
        printf ("Input too long [%s]\n", buff);
        return 1;
    }
    
    sscanf(buff, "(%d+%d)x(%d-%d)",&e,&f,&g,&h);
    
    printf("Check \n");
    printf("%d %d %d %d\n" ,a,b,c,d);
    printf("%d %d %d %d\n" ,e,f,g,h);
    
    abcd=(a+b)*(c-d);
    efgh=(e+f)*(g-h);
    
    printf("Results: %d %d \n",abcd,efgh);
    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2022-10-05 14:45:54

扫描是错误的。扫描(“%typeOfFirstVariable%scanf.”,&firstVariable,&secondVariable.);

代码语言:javascript
复制
int a,b,c,d,abcd;
    int e,f,g,h,efgh;
    
    printf("1. "); 
    scanf("%d %d %d %d)",&a,&b,&c,&d);
    
    ...
    return 0;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73962107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档