Reputation: 121
I am a newbie in C and am trying to make a hangman game where a player will have to guess a random word selected by the program. But I am stuck in getting the word. I tried a lot and found some answers on SO but could not relate it to my case.
Here's the code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char dictionary[3][15] = {"food","cat","coder"};
//15 is max length of each word
char getWord() {
srand(time(0));
char *random_elem = dictionary[rand()%3];
printf(random_elem);
return random_elem;
}
void gamePlay() {
*word = getWord();
printf(*word);
return;
}
int main() {
printf("Welcome to Hangman\n");
printf("------------------------------------\n\n");
gamePlay();
}
The printf
in the getWord()
works but not in gamePlay()
The following error is generated:
<stdin>:11:12: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
printf(random_elem);
^~~~~~~~~~~
<stdin>:11:12: note: treat the string as an argument to avoid this
printf(random_elem);
^
"%s",
<stdin>:12:12: error: cannot initialize return object of type 'char' with an lvalue of type 'char *'
return random_elem;
^~~~~~~~~~~
<stdin>:17:6: error: use of undeclared identifier 'word'; did you mean 'for'?
*word = getWord();
^~~~
for
<stdin>:17:6: error: expected expression
<stdin>:18:13: error: use of undeclared identifier 'word'
printf(*word);
^
1 warning and 4 errors generated.
OS: Android 11 App: Cxxdroid
If that might help
Upvotes: 0
Views: 315
Reputation: 213842
In this case you can return a pointer, since the actual strings are declared with static storage duration (if they are local variables, you can't do that). You should however const-qualify the pointer since string literals are read-only. Fixed code:
const char* getWord() {
static const char dictionary[3][15] = {"food","cat","coder"};
srand(time(0));
const char *random_elem = dictionary[rand()%3];
puts(random_elem);
return random_elem;
}
I moved the variable declarations inside the function since global variables should be avoided. static
ensures that they still have static storage duration so you can return a pointer to them.
The warnings about "format string is not a string literal" is nothing to be concerned with in this case. If you replace printf
with puts
they should go away.
Upvotes: 1
Reputation: 51
The right code is the above.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char dictionary[3][15] = {"food","cat","coder"};
//15 is max length of each word
char* getWord() {
srand(time(0));
char *random_elem = dictionary[rand()%3];
printf("%s\n",random_elem);
return random_elem;
}
void gamePlay() {
char *word = getWord();
printf("%s\n",word);
return;
}
int main() {
printf("Welcome to Hangman\n");
printf("------------------------------------\n\n");
gamePlay();
}
Upvotes: 2