2015-07-03 2 views
-1

Ищите похожий ответ, но ничего не пытаюсь работать. У меня проблема, я хочу изменить значение word, вызвав функцию void init(), но когда я печатаю слово, оно не работает.C, указатели и функции void

Прошли много часов на этом, поэтому любая помощь будет оценена по достоинству.

int main(void) 
{ 
    char word[MAX_WORD_LEN + 1]; 
    unsigned wrongGuesses = 0; 
    int guessedLetters[ALPHABET_SIZE] = { 
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
    }; 
    init(&word); 
    printf("%s", word); 
    displayWord(word, guessedLetters); 
    guessLetter(word, guessedLetters); 
    return EXIT_SUCCESS; 
} 

void init(char* word) 
{ 
    int randValue; 
    char* randWord; 
    const char* words[NUM_WORDS] = { 
     "array",  "auto",  "break",  "case",  "cast", 
     "character", "comment", "compiler", "constant", "continue", 
     "default", "double",  "dynamic", "else",  "enum", 
     "expression", "extern",  "file",  "float",  "function", 
     "goto",  "heap",  "identifier", "library", "linker", 
     "long",  "macro",  "operand", "operator", "pointer", 
     "prototype", "recursion", "register", "return",  "short", 
     "signed",  "sizeof",  "stack",  "statement", "static", 
     "string",  "struct",  "switch",  "typedef", "union", 
    "unsigned", "variable", "void",  "volatile", "while" 
    }; 
    int seed; 
    seed = (time(NULL)); 
    srand(seed); 
    randValue = rand() % NUM_WORDS; 
    randWord = words[randValue]; 
    printf("%s", randWord); 
    *word = randWord; 
} 
+0

Ваш главный должен иметь следующую подпись: 'Int основной (INT ARGC, символ * ARGV [])'. Особенно для C++ (на который вы отметили этот вопрос, так что я предполагаю, что для этого есть причина). – celticminstrel

+0

Помимо этой проблемы, эта вариация таблицы слов значительно облегчает перенос сводного обслуживания, не нарушая ничего: 'const char * words [] = {" array "," auto ",' ... ', "в то время как"}; #define NUM_WORDS (sizeof (words)/sizeof (слова [0])) ' – wallyk

+0

' word' уже типа 'char *', поэтому вам не нужно передавать его в 'init' как' & word', потому что это тоже неправильно !! – ThunderWiring

ответ

3

Строки не могут быть переданы в С.

Вы должны использовать strcpy() или memcpy(), чтобы скопировать строку

strcpy(word,randWord); 
+0

как пожелаете .... –

+0

Конечно! Не могу сказать, что я очень люблю C. Спасибо, что ответили на мой вопрос. – abndonurfriends

+0

Также рассмотрите возможность изменения 'char * randWord;' на 'char * randWord = NULL;' – WedaPashi

2

Обратите внимание на компилятор предупреждения.

word.c: At top level: 
word.c:16:6: warning: conflicting types for ‘init’ 
void init(char* word) 
    ^
word.c:8:4: note: previous implicit declaration of ‘init’ was here 
    init(&word); 

Вы передаете указатель на указатель на init().

И, как сказал @Gopi, вы не можете копировать строки, назначая.

1

Вот два способа исправить это:

  1. проход init(word) и вниз в init сказать strcpy(word, randWord).

  2. Изменение word в const char *word, продолжают называть init(&word), изменить определение init к void init(const char ** word) и оставьте задание *word = randWord. (В этом случае вы должны объявить words[] и randWord в const char *, также.)

Смежные вопросы