2012-01-30 13 views
5

Ok, sono un noob con C, ma penso che il codice sia di base e semplice. Questo programma è per un incarico universitario e si suppone che abbia la funzione 'isdigit()' in esso. Ecco il codiceErrore di compilazione GCC: il formato '% c' si aspetta argomento di tipo 'char *', ma l'argomento 2 ha 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.\$ 
    } 
} 

Quando provo a compilare, ottengo il seguente errore

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

Cosa diavolo sta succedendo? Sono alla disperata ricerca di aiuto. Qualsiasi aiuto. Sto seriamente sul punto di rinunciare a questo programma. Perché sta dicendo che si aspetta un argomento di "char *" quando il mio libro di testo mostra che "% c" è per il normale ole "char"? Sto usando nano, gcc e Ubuntu se questo fa la differenza.

+2

'gcc' genera più avvisi per il programma. Dovresti correggere * tutti * di loro. Ad esempio, ti manca '#include ' (richiesto per 'srand()' e 'rand()') e '#include ' (richiesto per 'clock()'). –

+0

@KeithThompson Durante la compilazione, non ho più errori e il programma ora funziona come volevo. Quindi, suppongo che sto chiedendo se continuerà a funzionare? Perché nel mio libro di testo, l'unica istruzione necessaria per il preprocessore è '#include ' e '#include ' è per la funzione isdigit(). – Nyxm

+0

Hai bisogno delle intestazioni che ho descritto sopra se hai intenzione di chiamare quelle funzioni. Ci sono circostanze in cui puoi scappare senza usarle, ma non entrerò nei dettagli; basta aggiungere le direttive '# include'. gcc metterà in guardia sulle chiamate alla funzione se si usa '-std = c99 -pedantic'. Quale libro di testo stai usando? Se mostra un esempio che chiama 'rand()' senza '#include ', o che chiama 'clock()' senza '#include ', allora il tuo libro di testo è sbagliato. –

risposta

11

Per scanf(), è necessario passare un puntatore a un char, altrimenti non ha alcun modo per memorizzare il carattere, dal momento che ha detto char sarebbe passato in termini di valore. Quindi hai bisogno di &userChar.

Diciamo che userChar è 0 prima della chiamata. Con il vostro codice attuale, si sta praticamente facendo questo (per quanto riguarda l'utilità va):

scanf("%c", 0); 

quello che vuoi è questo:

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

Che è &userChar.

Il man pagina dedicata agli scanf menzioni questo:

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

Bel dolore. Non posso credere di aver dimenticato il '&'. Mi sento un idiota. Commenterà di nuovo direttamente con i risultati. – Nyxm

+0

Funziona perfettamente. Grazie mille molto. Ho lottato con questo programma per alcuni giorni. Prima era la conversione di char in int, e ora questo. Ancora una volta, grazie! – Nyxm

+0

+1 ottimo modo per spiegare il passaggio per valore con un'effettiva espansione del valore. –

1

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

0

È necessario passare in un puntatore al posto del valore del char.

scanf("%c",&userChar); 
Problemi correlati