【问题标题】:C, pointers and void functionsC、指针和void函数
【发布时间】:2015-07-03 03:00:25
【问题描述】:

已寻找类似的答案,但我尝试的任何方法都无效。 有一个问题,我想通过调用 void 函数init() 来更改word 的值,但是当我打印单词时它不起作用。

为此花费了很多时间,因此我们将不胜感激。

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;
}

【问题讨论】:

  • 您的主文件应具有以下签名:int main(int argc, char* argv[])。特别是对于 C++(您已将此问题标记为,所以我认为这是有原因的)。
  • 除了您遇到的问题之外,单词表的这种变体使得在不破坏任何东西的情况下可以更轻松地进行任性维护:const char *words[] = {"array", "auto", ..., "while"}; #define NUM_WORDS (sizeof (words)/sizeof (words[0]))
  • word 已经属于char* 类型,因此您无需将其作为&word 传递给init,因为它也是错误的!!

标签: c++ c pointers char-pointer


【解决方案1】:

字符串在 C 中是不可赋值的。

需要使用strcpy()memcpy()复制字符串

strcpy(word,randWord);

【讨论】:

  • 当然!不能说我很喜欢 C。谢谢你回答我的问题。
  • 另外,考虑将char* randWord; 更改为char* randWord = NULL;
  • @abndonurfriends:如果你不是很喜欢 C,而且 C++ 是一种选择(毕竟你确实标记了它 C++),那么就拿起一本 C++ 初学者的书。使用std::string,您实际上可以使用word = randword,它就可以工作..
【解决方案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 所说,您不能通过分配来复制字符串。

【讨论】:

    【解决方案3】:

    这里有两种不同的方法来解决这个问题:

    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 *。)

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 2011-07-31
      • 2018-04-19
      • 2012-11-21
      • 1970-01-01
      • 2013-11-14
      • 2012-02-26
      • 2012-07-01
      相关资源
      最近更新 更多