Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC compile error: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]

Tags:

c

char

gcc

Ok, I'm a noob with C, but I think the code is basic and straightforward. This program is for a college assignment, and is supposed to have the 'isdigit()' function in it. Here is the 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.\$
    }
}

When I try to compile, I get the following 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]

What on earth is going on? I am desperate for help. Any help at all. I am seriously about to just give up on this program. Why is it saying it expects argument of 'char *' when my textbook shows that "%c" is for regular ole 'char'? I am using nano, gcc, and Ubuntu if that makes any difference.

like image 534
Nyxm Avatar asked Jan 30 '12 21:01

Nyxm


2 Answers

For scanf(), you need to pass a pointer to a char, otherwise it doesn't have any way to store the character, since said char would be passed in by value. So you need &userChar instead.

Let's say userChar is 0 before the call. With your current code, you're basically doing this (as far as utility goes):

scanf("%c", 0);

What you want is this:

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

Which is &userChar.

The man page for scanf mentions this:

   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.
like image 115
Dan Fego Avatar answered Nov 11 '22 16:11

Dan Fego


replace scanf("%c", userChar); with scanf("%c", &userChar);.

like image 43
Dan D. Avatar answered Nov 11 '22 16:11

Dan D.