No se puede identificar el error con el código, fallando un caso de prueba

Tengo que presentar este código como solución. Mi código se ejecuta perfectamente para los casos de prueba dados, pero no puedo enviarlo porque el código falla una de las pruebas en el solucionador. Por favor ayuda si puedes. Cualquier ayuda es apreciada.

Artículo de regalo con dígitos

A muchos clientes les gustaron los artículos de regalo con dígitos inscritos en ellos y comenzaron a comprarlos para regalos para cumpleaños y aniversarios. Un cliente vino a comprar un regalo para el 25 aniversario de boda de su madre y otro vino para comprar un regalo para el cumpleaños número 18 de su hijo. Quedaron decepcionados al ver solo un dígito inscrito en los artículos de regalo.

Al ver la locura por este tipo de artículos de regalo, Nisha dio un pedido masivo de artículos de regalo con números de 2 dígitos inscritos en ellos. El paquete llegó cuando estaba ocupada y su hijo de 4 años comenzó a organizar los artículos recién llegados en el estante para exhibirlos. Pero él ha puesto todos los artículos al revés. Ella necesita cambiar la orientación de los artículos.

Pero para su sorpresa, descubrió que algunos números de 2 dígitos eran válidos cuando se leen en ambos sentidos. [P.ej. 68 leer al revés sería 89, que también es un número válido] Ayuda a Nisha a identificar todos estos números de 2 dígitos.

Caso de prueba

Entrada 1

18

Salida 1

Entrada 2

46

Salida 2

NO

Entrada 3

a4

Salida 3

entrada inválida

Código C:

#include #include #include int main() { char str[2]; scanf("%s",str); int flag=0; if (strlen(str)!=2) { flag=2;goto label; } else if (str[1]=='0') { flag=1;goto label; } for(int i=0;i<2;i++) { if(isdigit(str[i])) { if((str[i]!='0')&&(str[i]!='1')&&(str[i]!='6')&&(str[i]!='8')&& (str[i]!='9')) { flag=1;break; } } else {flag=2;break;} } label: if (flag==0) printf("YES"); else if (flag==1) printf("NO"); else if (flag==2) printf("Invalid Input"); return 0; } 

El resultado después de la evaluación es el siguiente:

salida

La salida del progtwig es incorrecta, por ejemplo, para 4a , porque se sale del bucle después de verificar el primer dígito.

La respuesta del progtwig es NO cuando debería ser una Invalid Input .

El principal problema con el código son las siguientes dos líneas.

 char str[2]; scanf("%s",str); 

Cuando el especificador de entrada / conversión scanf() es “% s”, la función agregará un carácter NUL (‘\ 0’) a la entrada Y la entrada no se detendrá hasta que se encuentre un carácter de white space .

Espacio en blanco: espacio, tabulador, secuencia de nueva línea

Por lo tanto, cuando se usa el especificador de entrada / conversión ‘% s “hay dos consideraciones:

  1. el búfer de entrada debe ser de 1 carácter más que el número máximo permitido de caracteres de entrada
  2. Se debe usar el modificador MAX_CHARACTERS, que es 1 menos que la longitud del búfer de entrada.

Por lo tanto, esas dos líneas deben ser:

  char str[3]; // allows room for 2 characters plus NUL terminator scanf("%2s",str); // only allow user to input two characters 

Sin embargo, hay algunos otros problemas con el código.

Esta línea:

  if (strlen(str)!=2) 

no permite cuando solo hay un solo dígito IE 1 … 9 inclusive.

Es una práctica de progtwigción muy pobre utilizar la secuencia goto + label. Resultados invariables en el código ‘spaghetti’.

este bloque de código:

  else if (str[1]=='0') { flag=1; goto label; } 

no es correcto ya que rechaza 10, 20, 30, 40, 50, 60, 70, 80, 90. Nota: en C, un índice de matriz está en el rango 0 … (una menos que la cantidad de entradas en el matriz) Nota: ‘0’ es 0x30 en hexadecimal y el terminador NUL es 0x00 en hexadecimal.

Esta línea:

  for( int i=0; i<2; i++ ) 

está asumiendo que todas las 'edades' son números de 2 dígitos. Eso excluye las edades 1 ... 9 inclusive. Sugerir:

  for( size_t i=0; i<=strlen(str); i++ ) 

Nota: strlen() devuelve un size_t , no un int y devuelve el índice al carácter NUL

  flag = 2; // initialize to indicate invalid input if( strlen( str ) ) { // then some characters entered by user for( size_t i=0; i 

Sin embargo, el fragmento de código anterior no se maneja cuando la entrada del usuario contiene 1 dígito invertible y 1 dígito no invertible, ni cuando ninguna de las entradas del usuario es un dígito. Te dejaré suministrar la lógica apropiada. Lo anterior debe comenzar en la dirección correcta.

Puedes probar el siguiente código!

 #include #include void main(){ char str[2]; int a,b; scanf("%s",str); a=str[0]; b=str[1]; if(strlen(str)!=2) printf("Invalid Input"); else if(str[0]=='0') printf("NO"); else if((a>47&&a<58)&&(b>47&&b<58)) { if(((str[0]=='1')||(str[0]=='6')||(str[0]=='8')||(str[0]=='9'))&&((str[1]=='1')||(str[1]=='6')||(str[1]=='8')||(str[1]=='9'))) printf("YES"); else printf("NO"); } else printf("Invalid Input"); }