2012-01-30 12 views
5

Ok, soy un novato con C, pero creo que el código es básico y directo. Este programa es para una tarea universitaria y se supone que tiene la función 'isdigit()'. Aquí está el códigoGCC error de compilación: formato '% c' espera argumento de tipo 'char *', pero argumento 2 tiene tipo 'int' [-Wformat]

//by Nyxm 
#include <stdio.h> 
#include <ctype.h> 

main() 
{ 
    char userChar; 
    int userNum, randNum; 
    srand(clock()); 
    printf("\nThis program will generate a random number between 0 and 9 for a user to guess.\n"); 
    /*I changed it from '1 to 10' to '0 to 9' to be able to use the isdigit() function which 
    will only let me use a 1 digit character for an argument*/ 
    printf("Please enter a digit from 0 to 9 as your guess: "); 
    scanf("%c", userChar); 
    if (isdigit(userChar)) 
    { 
      userNum = userChar - '0'; 
      randNum = (rand() % 10); 
      if (userNum == randNum) 
      { 
        printf("Good guess! It was the random number.\n"); 
      } 
      else 
      { 
        printf("Sorry, the random number was %d.\n", randNum); 
      } 
    } 
    else 
    { 
      printf("Sorry, you did not enter a digit between 0 and 9. Please try to run the program again.\$ 
    } 
} 

Cuando intento compilar, obtengo el siguiente error

week3work1.c: In function ‘main’: 
week3work1.c:14:2: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat] 

¿Qué diablos está pasando? Estoy desesperado por ayuda. Cualquier ayuda en absoluto. Estoy realmente a punto de renunciar a este programa. ¿Por qué está diciendo que espera un argumento de "char *" cuando mi libro de texto muestra que "% c" es para "char" normal? Estoy usando nano, gcc y Ubuntu si eso hace alguna diferencia.

+2

'gcc' produce múltiples advertencias para su programa. Debería arreglar * todos * de ellos. Por ejemplo, te falta '#include ' (requerido para 'srand()' y 'rand()') y '#include ' (requerido para 'clock()'). –

+0

@KeithThompson Al compilar, ya no tengo errores, y el programa ahora funciona como yo quería. Entonces, ¿supongo que estoy preguntando si continuará funcionando? Porque en mi libro de texto, la única instrucción del preprocesador necesaria es '#include ' y '#include ' es para la función isdigit(). – Nyxm

+0

Necesita los encabezados que describí anteriormente si va a llamar a esas funciones. Hay circunstancias en las que puedes escapar sin usarlas, pero no entraré en detalles; solo agregue las directivas '# include'. gcc advertirá sobre las llamadas a funciones si usa '-std = c99 -pedantic'. ¿Qué libro de texto estás usando? Si muestra un ejemplo que invoca 'rand()' sin '#include ', o que llama 'clock()' sin '#include ', entonces su libro de texto está equivocado. –

Respuesta

11

Para scanf(), tiene que pasar un puntero a un char, de lo contrario no tiene ninguna manera de almacenar el carácter, ya que dicho char sería trasladado en términos de valor. Entonces necesita &userChar en su lugar.

Digamos userChar es 0 antes de la llamada. Con su código actual, que está básicamente haciendo esto (en lo que va de utilidad):

scanf("%c", 0); 

Lo que quiere decir esto:

scanf("%c", some-location-to-put-a-char); 

Cuál es &userChar.

La página man para scanf menciones esto:

c  Matches a sequence of characters whose length is specified by 
      the maximum field width (default 1); the next pointer must be a 
      pointer to char, and there must be enough room for all the char‐ 
      acters (no terminating null byte is added). The usual skip of 
      leading white space is suppressed. To skip white space first, 
      use an explicit space in the format. 
+0

Buena pena. No puedo creer que olvidé el '&'. Hombre, me siento como un idiota. Volveré a comentar directamente con los resultados. – Nyxm

+0

Funciona perfecto. Muchas gracias. He estado luchando con este programa durante unos días. Primero fue la conversión de char a int, y ahora esto. Una vez más, ¡gracias! – Nyxm

+0

+1 gran manera de explicar pasar por valor con una expansión real del valor. –

1

reemplazar scanf("%c", userChar); con scanf("%c", &userChar);.

0

Tiene que pasar un puntero en lugar del valor del producto de carbonización.

scanf("%c",&userChar); 
Cuestiones relacionadas