¿Cómo obtener un valor ASCII de carácter en una variable entera?

Soy nuevo en C y no pude encontrar la respuesta a mi pregunta en el foro.

El punto es que necesito obtener un valor de cartas de mazo del usuario. Así que puede extenderse de 2 a 10 y también puede ser ‘J’, ‘Q’, ‘K’ o ‘A’. Eso significa que puede ser un entero o un carácter.

Estoy tratando de ponerlo en una variable entera llamada “_val1”. Este trabajo para cualquier número del 0 al 10. Esperaba que si escribía una letra, _val1 obtendría el valor ASCII de ese carácter (que podría usar más adelante para mis vertidos). Pero en cambio _val1 geta valor ‘0’ y la letra pasa automáticamente a mi próxima llamada de variable (que es _naipe1).

¿Cómo puedo resolver eso?

Eso significa, ¿de qué manera utilizo scanf para obtener un valor entero o el valor ASCII de un carácter?

short int _val1, _val2; char _naipe1, _naipe2; printf("Qual a 1ª carta?\n Valor:"); scanf(" %hd", &_val1); printf("Valor 1 = %hd \n", _val1 ); printf(" Naipe:"); scanf(" %c", &_naipe1); 

bueno, si yo fuera tú trataría de simplificar el problema:

  • obtenga el valor ASCII de la representación de la tarjeta de '2' a '9' y 'J','Q','K','A' ; allí puede simplemente usar una operación scanf("%c") o incluso mejor una operación getchar() .

luego, o bien continúa usando la representación ASCII de sus tarjetas a lo largo de su algoritmo, o puede traducirlas mediante una función de mapeo como:

 int map(char card) { switch (card) { case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return card-'0'; case 'A': return 1; case 'J': return 10; case 'Q': return 11; case 'K': return 12; } } 

Primero, hay 52 cartas para una baraja de póquer típica, que se dividen en 4 palos: corazones, diamantes, palas y palos. Este tipo de sugerencias sugieren que los comentarios del usuario serán algo así como: 10s, Ad, 3c, etc. (es decir, 10 de espadas, As de diamantes y 3 de clubes) Por lo tanto, no solo debe determinar el valor de la tarjeta individual, también debe determinar el traje

Esto no resolverá todos esos requisitos, pero al menos responderá a su pregunta más directa, cómo leer un int o un char usando scanf() .
Esto demostrará que:

 #include  int main(int argc, char** argv) { int aNumber; char aChar; printf("\nEnter a number:"); scanf("%d", &aNumber); printf("\nEnter a character:"); scanf("%c", &aChar); printf("\nThe number entered is %d\n", aNumber); printf("\nThe character entered is %c\n", aChar); return 0; } 

También puede simplemente tener todos los valores en una cadena como

 char cards[]={"Ad Js 10c 2c Qh"}; 

Luego analícelo usando strtok() , luego pruebe cada token para ver su contenido ascii, usando funciones como isdigit() o isalpha()

Nota: tendrá que asignar cada tarjeta a un valor para mantenerlas en orden, algo así como esta enumeración abreviada puede funcionar:

 enum { AD = 1, //start enum values at 1 for the diamonds suit 2D, 3D, ...//fill in rest of cards here JC, QC, KC, // last card == 52, with the clubs suit }; 

La razón por la que su salida de _val1 es 0 cuando ingresa una letra radica en el hecho de que ha declarado _val1 como un int corto. Deberías estar utilizando un char. Entonces puedes asignar y comparar sus valores ascii.

 char card; int value; scanf("%c", card); if(card < 58 && card > 49) value = card - 48; else { switch(card) { case 'a': value = 1; case '0': value = 10; case 'j': value = 11; case 'q': value = 12; case 'k': value = 13; default: printf("Must enter 0-9 (0 for 10 card), or a, j, q, k\n"); } } 

Para leer en “A”, “2”, “3”, … “10”, “J”, … “K”, use fgetc() y strchr() .

 #include  #include  #include  #include  short GetCardRank(void) { static const char rank[] = "A234567891JQK"; short val = -1; int ch = fgetc(stdin); while (isspace(ch)) ch = fgetc(stdin); // Skip leading white-space char *p = strchr(rank, toupper(ch)); // Use toupper() to make case insensitive if (ch != EOF && p != NULL && *p != '\0') { short val = (short) (p - rank + 1); if (val != 10) return val; ch = fgetc(stdin); if (ch == '0') return val; val = 1; // Allow a lone '1' to act like an 'A' } ungetc(ch, stdin); // Put back unused char for next IO function return val; } 

Estoy tratando de ponerlo en una variable entera llamada “_val1”. Este trabajo para cualquier número del 0 al 10. Esperaba que si escribía una letra, _val1 obtendría el valor ASCII de ese carácter (que podría usar más adelante para mis vertidos). Pero en cambio _val1 geta valor ‘0’ y la letra pasa automáticamente a mi próxima llamada de variable (que es _naipe1)

El problema es que el especificador de conversión %d solo reconoce cadenas de dígitos decimales (con un + o - inicial opcional) y dejará de leer en el primer carácter sin dígitos; Si escribe algo que no sea un dígito, la operación de entrada fallará y ese carácter se dejará en el flujo de entrada.

Su mejor apuesta es leer su entrada como texto, luego convertirla a un valor numérico manualmente, algo como lo siguiente:

 #include  #include  /** * Reads a card's face value (2-10,J,Q,K,A) from standard input * Returns 0 on error */ short get_card_value( void ) { char buf[4]; // large enough to hold a 2-digit string plus newline plus 0 terminator short val = 0; if ( fgets( buf, sizeof buf, stdin ) != NULL ) { char *chk; short tmp = (short) strtol( buf, &chk, 0 ); if ( isspace( *chk ) || *chk == 0 ) { if ( tmp >= 2 && tmp <= 10 ) val = tmp; } else { switch( tolower( *chk ) ) { case 'j': val = 11; break; case 'q': val = 12; break; case 'k': val = 13; break; case 'a': val = 11; break; default: break; } } } // else read error return val; } 

Llamarías a esto como

 val1 = get_card_value(); if ( val1 == 0 ) // error on input 

Este código no realiza ninguna comprobación de longitud en la entrada, por lo que si ingresa un valor de tarjeta de 1234567890, eso no se manejará correctamente.

No use guiones bajos en sus nombres de variables; Los nombres con guiones bajos están reservados para la implementación.