By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,513 Members | 1,693 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,513 IT Pros & Developers. It's quick & easy.

what does this mean??

P: n/a
I got errors:
qu2-1.c:66: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'
qu2-1.c:72: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'

but I don't quite know what it means...
<code/>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MAXPATIENTS 20

struct details {
int id;
char forename[20];
char initial;
char surname[20];
int day_of_entry;
int max_wait;
};

struct details patient[MAXPATIENTS];
int npatients = 0;

//Functions
int day_now(void);
int read_queue(void);
int list_patient(int index);
int queue_patient(struct details newpatient);
void list_queue();
void write_queue();
int insert_patient(int index, struct details newpatient);
int delete_patient(int index);
int find_patient_id(int id);
//Main starts here
int main (void) {
int Choice;
int id;
int index;
int n;
//Loop that continues the program
while(n < 0){
//To keep program running
//Displaying Menu
printf("\n\n");
printf("_________________________________________\ n");
printf("|-----------NHS Queue Control-----------|\n");
printf("| Create New Patient \t- Press 1\t|\n");
printf("| Delete Patient \t- Press 2\t|\n");
printf("| Find Patient \t\t- Press 3\t|\n");
printf("| List Queue \t\t- Press 4\t|\n");
printf("| Quit \t\t\t- Press 5\t|\n");
printf("|_______________________________________|\ n");
printf("Choice: ");
scanf("%d",&Choice);
printf("\n");
printf("%d \n",day_now());
//Choice made, carrying out function
switch (Choice){
//New Patient
case 1:
index = read_queue() + 1;
printf("Please enter the following details\n");
printf("Patient ID: ");
scanf("%d", &patient[index].id);
printf("Forename: ");
scanf("%s", &patient[index].forename);
printf("\n");
printf("Middle Initial: ");
scanf("%c", &patient[index].initial);
printf("\n");
printf("Surname: ");
scanf("%s", &patient[index].surname);
printf("\n");
printf("Day of Entry (Since 1/1/1970): ");
scanf("%d", &patient[index].day_of_entry);
printf("Maximum Waiting Time: ");
scanf("%d", &patient[index].max_wait);
insert_patient(index, patient[index]);
break;
........

int insert_patient(int index, struct details newpatient) {
//For testing only.....
printf("%d \n",patient[index].id);
printf("%s \n",patient[index].forename);
printf("%c \n",patient[index].initial);
printf("%s \n",patient[index].surname);
printf("%d \n",patient[index].day_of_entry);
printf("%d \n",patient[index].max_wait);
}

May 27 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
In article <11*********************@q66g2000hsg.googlegroups. com>,
ch****@gmail.com <ch****@gmail.comwrote:
>I got errors:
qu2-1.c:66: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'
qu2-1.c:72: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'
Those are warnings, not errors.
>struct details {
int id;
char forename[20];
char initial;
char surname[20];
int day_of_entry;
int max_wait;
};
Notice that forename and surname are fixed length arrays of up
to 20 characters. A fixed length character array does not necessarily
end in a null byte ('\0'), but you are attempting to print the
names using %s format, which is reserved for character arrays that
*do* end in a null byte. The compiler is warning you that this
might be an incompatability -- if you had a forename or surname
which used all 20 characters of the array, then printing that
forename or surname with %s would "fall off the end" of the character
array with undefined results.

If you are -certain- that forename or surname will end in '\0' then you
can either ignore the warnings, or you can cast the type in the
printf() calls.
--
"law -- it's a commodity"
-- Andrew Ryan (The Globe and Mail, 2005/11/26)
May 27 '07 #2

P: n/a
ro******@ibd.nrc-cnrc.gc.ca (Walter Roberson) writes:
In article <11*********************@q66g2000hsg.googlegroups. com>,
ch****@gmail.com <ch****@gmail.comwrote:
>>I got errors:
qu2-1.c:66: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'
qu2-1.c:72: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'

Those are warnings, not errors.
>>struct details {
int id;
char forename[20];
char initial;
char surname[20];
int day_of_entry;
int max_wait;
};

Notice that forename and surname are fixed length arrays of up
to 20 characters. A fixed length character array does not necessarily
end in a null byte ('\0'), but you are attempting to print the
names using %s format, which is reserved for character arrays that
*do* end in a null byte. The compiler is warning you that this
might be an incompatability -- if you had a forename or surname
which used all 20 characters of the array, then printing that
forename or surname with %s would "fall off the end" of the character
array with undefined results.

If you are -certain- that forename or surname will end in '\0' then you
can either ignore the warnings, or you can cast the type in the
printf() calls.
The warnings were on the scanf() calls, not the printf() calls.
(chutsu: it would have saved time if you had told us that yourself.)

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
May 27 '07 #3

P: n/a
ch****@gmail.com wrote:
>
I got errors:
qu2-1.c:66: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'
qu2-1.c:72: warning: format '%s' expects type 'char *', but argument 2
has type 'char (*)[19u]'

but I don't quite know what it means...
<code/>
struct details {
int id;
char forename[20];
struct details patient[MAXPATIENTS];
int npatients = 0;
scanf("%s", &patient[index].forename);
(patient[index].forename) is the name of an array of 20 char.
(array of 20 char) is the type of the expression.
An expression of array type, converts to a pointer to its first element
in all but three cases. So,

scanf("%s", patient[index].forename);

is the right way to write that.

(&patient[index].forename) is the address of an array of 20 char.
(pointer to an array of 20 char) is the type of the expression.
When the name of an array is the operand of the & operator,
is one of the cases where the name of an array doesn't
automatically convert to a pointer.
When it's the operand of sizeof is another case
where the name of an array doesn't
automatically convert to a pointer.
The third case, is when a string literal initializes an array.

--
pete
May 27 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.