为了账号安全,请及时绑定邮箱和手机立即绑定

C:如何使scanf()输入具有以下两种格式之一?

C:如何使scanf()输入具有以下两种格式之一?

C
largeQ 2020-02-03 12:41:34
我需要执行此程序,该程序将两个三角形进行比较。基本上,除了用户在其中输入初始数据的部分之外,其他所有东西都可以正常工作。我的主要问题是条件之一是用户可以输入三角形的三个边的长度或三个顶点的X,Y坐标。我需要它像以下两种方式一样工作:此输入意味着用户使用了边长:{ 5 , 5 , 5 }此输入意味着用户使用了顶点的X,Y坐标:{ [ 1 ; 1 ] , [ 3 ; 1 ] , [ 2 ; 2 ] }这是我尝试解决该问题的代码,但是由于某些原因,如果用户使用顶点输入第一个条件(该条件是否不是边长),则会使所有内容混乱。#include <stdio.h>int main() {    double a, b, c, A[2], B[2], C[2];    char s;    if(scanf(" { [ %lf ; %lf  ] , [ %lf ; %lf  ] , [ %lf ; %lf  ] }%c",             &A[0], &A[1], &B[0], &B[1], &C[0], &C[1], &s) != 7 && s != '\n') {        s = ' ';        if(scanf(" { %lf , %lf , %lf }%c", &a, &b, &c, &s) != 4 && s != '\n') {            printf("error\n");            return 1;        }    }    // rest of the code...    printf("success\n");    return 0;}如果我交换这两个条件,它将切换并且仅当用户使用顶点输入时它才起作用...是否有可能使它像这样简单地工作?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

最好使用char buf[big_enough * 2]; fgets(buf, sizeof buf, stdin)读取行然后解析它(最好使用sscanf(buf, " { [ %lf ...和)sscanf(buf, " { %lf ...。


但是,如果代码必须保留scanf():


OP的第一个scanf(" { [ %lf ...消费了'{'预期的第二个scanf( " { %lf ...


代替:


if(scanf(" { [ %lf ; %lf  ] , [ %lf ; %lf  ] , [ %lf ; %lf  ] }%c", 

        &A[0], &A[1], &B[0], &B[1], &C[0], &C[1], &s) != 7 && s != '\n') {

    s = ' ';


    //    no  {

    //        v

    if(scanf(" %lf , %lf , %lf }%c", &a, &b, &c, &s) != 4 && s != '\n') {

        printf("error\n");

        return 1;

    }


}

首选fgets()方式:


// Form a reasonable, yet generous buffer

#define I (50 /* rough estimate of characters use to read a double, adjust as needed */)

//                          { [ 1 ; 1 ] , [ 3 ; 1 ] , [ 2 ; 2 ] }\n\0

#define LINE_SIZE_EXPECTED (4 + I+3+I  +7  +I+3+I  +7  +I+3+I+6)

char buf[LINE_SIZE_EXPECTED * 2]; // Lets us use 2x for extra spaces, leading zeros, etc.


if (fgets(buf, sizeof buf, stdin)) {

  // Consider using "%n" to detect a complete scan and check for no trailing junk

  int n = 0;

  sscanf(buf, " { [ %lf ; %lf  ] , [ %lf ; %lf  ] , [ %lf ; %lf  ] } %n",

      &A[0], &A[1], &B[0], &B[1], &C[0], &C[1], &n);

  if (n && buf[n] == '\0') {

    // successful scan

  } else {

    n = 0;

    sscanf(" { %lf , %lf , %lf } %n", &a, &b, &c, &n);

    if (n && buf[n] == '\0') {

      // successful scan

    } else

      // both scans failed

    }

  }

}


查看完整回答
反对 回复 2020-02-03
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您应该使用sscanf。


以下code可能有效:


#include <stdio.h>


int main() {

    double a, b, c, A[2], B[2], C[2];

    char *s = NULL;

    size_t n = 0;


    getline(&s, &n, stdin);


    if(sscanf(s, " { [ %lf ; %lf  ] , [ %lf ; %lf  ] , [ %lf ; %lf  ] }", &A[0], &A[1], &B[0], &B[1], &C[0], &C[1]) != 6

        && sscanf(s, " { %lf , %lf , %lf }", &a, &b, &c) != 3) {


        printf("error\n");

        return 1;

    }


    // rest of the code...


    printf("success\n");

    return 0;

}


查看完整回答
反对 回复 2020-02-03
  • 2 回答
  • 0 关注
  • 719 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信