gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:26:29 25 4
gpt4 key购买 nike

我需要执行这个程序,它需要两个三角形并比较它们。

基本上,除了用户输入初始数据的部分之外,一切都正常。我的主要问题是条件之一是用户可以输入三角形三边的长度或三个顶点的 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;
}

如果我交换这两个条件,它就会切换,并且仅当用户使用顶点输入时才有效...

是否有可能让它以某种方式简单地像这样工作?

最佳答案

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

<小时/>

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

OP的第一个scanf(" { [ %lf ...消耗 '{'预计2号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
}
}
}

关于C:如何才能使 scanf() 输入具有两种格式之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com