2014-10-25 2 views
0
void pick() { 
    char* words[2]; 
    words[0] = "blah"; 
    words[1] = "hmm"; 

    char random; 
    srand(time(NULL)); 
    random = words[rand() % 2]; 
    printf(random); 
    return; 
} 

Это мой код, и я хочу, чтобы выбрать случайным образом слова из слов массива, но когда я запускаю его компилятор говорит: [Warning] назначение делает целое число от указателя без приведения [Enabled по умолчанию]Выберите случайно строку из массива в C

ответ

4

Вы объявили random как char, который представляет собой однобайтовое целочисленное значение. Вы назначаете ему элемент из массива words, и каждый из этих элементов имеет тип char*. Следовательно, вы получаете сообщение об ошибке при попытке присвоить значение char* целочисленному значению.

Вы хотели объявить random как char*.

Другие вещи, которые я укажу о коде:

void pick() { 
    char* words[2]; // 1 
    words[0] = "blah"; 
    words[1] = "hmm"; 

    char random; // 2 
    srand(time(NULL)); 
    random = words[rand() % 2]; // 3 
    printf(random); // 4 
    return; 
} 
  1. Это должен быть объявлен как массив const char*, так как вы назначая строковые литералы (которые неизменны) к нему.

  2. random также должен быть объявлен как const char*.

  3. Использование % для получения случайных чисел в определенном диапазоне традиционно не очень хорошо. Также см. Q13.16 How can I get random integers in a certain range? из часто задаваемых вопросов по comp.lang.c.

  4. printf(random) является опасным. Если строка, которую вы печатаете, включает в себя % символов, то printf будет ошибочной (и это потенциально может быть уязвимостью безопасности). Вы всегда должны предпочесть printf("%s", random). И поскольку вам, вероятно, нужна конечная новая линия, она должна быть printf("%s\n", random) или просто puts(random).

+1

я уже пробовал это, но я не знаю, почему я получаю эту ошибку с гольца * случайным образом: C: \ Program Files (x86) \ Dev-CPP \ mingw32 \ mingw32 \ Bin \ ld.exe \t не может открыть выходной файл C: \ Users .... Permission denied – Sergio

+0

Это другая проблема, и это проблема * linking *, а не проблема компиляции. Каково полное сообщение об ошибке? Какой файл он пытается открыть? Похоже, что 'ld' пытается записать файл, который у вас уже открыт. Вы пытаетесь построить, пока он уже запущен? – jamesdlin

+0

большое спасибо, это мне помогло :) – Sergio

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