c scanf

C: ¿Cómo puedo hacer que la entrada scanf() tenga uno de dos formatos?



(2)

Es mucho mejor usar char buf[big_enough * 2]; fgets(buf, sizeof buf, stdin) char buf[big_enough * 2]; fgets(buf, sizeof buf, stdin) para leer la línea y luego analizarla, tal vez con sscanf(buf, " { [ %lf ... y sscanf(buf, " { %lf ...

Sin embargo, si el código está obligado a quedarse con scanf() :

El primer scanf(" { [ %lf ... OP scanf(" { [ %lf ... consume el ''{'' esperado en el segundo scanf( " { %lf ...

En lugar:

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() preferida de los 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 } } }

Necesito hacer este programa, que toma dos triángulos y los compara.

Básicamente, todo funciona bien, excepto la parte, donde el usuario ingresa los datos iniciales. Mi problema principal es que una de las condiciones es que el usuario puede ingresar longitudes de tres lados de los triángulos o coordenadas X, Y de tres vértices.

Necesito que funcione como cualquiera de estos:
Esta entrada significa que el usuario usó longitudes de lados:

{ 5 , 5 , 5 }

Esta entrada significa que el usuario usó coordenadas X, Y de vértices:

{ [ 1 ; 1 ] , [ 3 ; 1 ] , [ 2 ; 2 ] }

Aquí está mi código de cómo traté de resolverlo, pero por alguna razón, si el usuario ingresa el vértice en la primera condición, que verifica si no es la longitud de los lados, desordena todo.

#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; }

Si cambio estas dos condiciones, cambia y solo funciona si las entradas del usuario usan el vértice ...

¿Es posible hacerlo de alguna manera simplemente trabajar así?


Usted debe utilizar sscanf .

El siguiente code podría funcionar:

#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; }