GCC erreur de compilation: format ‘%c’ attend argument de type ‘char *’, mais l'argument 2 est de type ‘int’ [-Wformat]
Ok, je suis un noob avec le C, mais je pense que le code est basique et simple. Ce programme est un collège d'affectation, et est censé pour avoir le 'appel isdigit()' la fonction en elle. Voici le code
//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.$
}
}
Lorsque j'essaie de compiler, j'obtiens l'erreur suivante
week3work1.c: In function ‘main’:
week3work1.c:14:2: warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
Ce qui sur terre se passe? Je suis désespérée pour obtenir de l'aide. Un peu d'aide. Je suis sérieux au sujet de donner à ce programme. Pourquoi est-ce qu'il dit qu'il s'attend argument de 'char *' quand mon manuel montre que "%c" est régulièrement ole 'char'? Je suis à l'aide de nano, gcc, et Ubuntu si cela fait une différence.
gcc
produit de multiples mises en garde pour votre programme. Vous devez corriger toutes les. Par exemple, vous êtes absent#include <stdlib.h>
(nécessaire poursrand()
etrand()
) et#include <time.h>
(nécessaire pourclock()
).- Lors de la compilation, je n'ai plus d'erreurs, et le programme fonctionne maintenant comme je le voulais. Donc, je crois que je me demande si elle va continuer à travailler? Parce que dans mon livre, le seul préprocesseur instruction nécessaire est '#include <stdio.h>' et le '#include <ctype.h>' est pour l'appel isdigit() fonction.
- Vous devez les en-têtes que j'ai décrit ci-dessus si vous allez appeler ces fonctions. Il y a des circonstances dans lesquelles vous pouvez vous en sortir sans les utiliser, mais je n'entrerai pas dans les détails, il suffit d'ajouter le
#include
directives. gcc mettra en garde contre les appels de fonction si vous utilisez-std=c99 -pedantic
. Ce manuel vous aide? Si elle montre un exemple qui appellerand()
sans#include <stdlib.h>
, ou que les appelsclock()
sans#include <time.h>
, votre livre est mauvais. - Le livre qui m'a donné est "Programmation en C pour le débutant absolu, 2e Édition" par Michael A. de la Vigne. J'ai remarqué que certains des exercices à la fin de chaque chapitre ont à voir avec les sujets avancés qui n'ont même pas proche d'être discuté. Par exemple, à la fin de la 2e chapitre (sur les principaux types de données) un exercice était de créer un programme qui utilise scanf() pour permettre à un utilisateur de saisir son nom. Ce qui serait une chaîne, et le chapitre avait à peine couverte de caractères, sans parler des chaînes de caractères.
- Je l'ai mentionné avant:
printf
etscanf
formats ne sont pas les mêmes. Pourprintf
,%c
nécessite un argument de typeint
, ce qui devrait être une valeur de caractère. Pourscanf
,%c
nécessite un pointeur verschar
. Assurez-vous que vous êtes en train de lire la documentation de la fonction que vous utilisez.
Vous devez vous connecter pour publier un commentaire.
Pour
scanf()
, vous avez besoin pour passer un pointeur vers unchar
, sinon ce n'est pas une façon de conserver le caractère, puisqu'ditchar
serait passé par valeur. Si vous avez besoin&userChar
à la place.Disons
userChar
est0
avant l'appel. Avec votre code actuel, vous êtes essentiellement faire ce (autant que de l'utilitaire va):Ce que vous voulez, c'est ceci:
Qui est
&userChar
.La
man
page pourscanf
mentionne ceci:remplacer
scanf("%c", userChar);
avecscanf("%c", &userChar);
.Vous avez besoin pour passer un pointeur à la place de la valeur du char.