массив символов не присваивается

Хорошо, поэтому я хочу сохранить слово в массиве char, но это дает мне ошибку

Вот мой код

#include  #include  #include  #include  int main(void) { char yesno[30] = "n"; //yes/no answer char class[30] = "undefined";//choosen class int classchoosen = 0; /* initialize random seed: */ srand ( time(NULL) ); printf("Welcome, which class do you wanna play with? \n"); printf("Type W for Warrior, M for Mage or R for Ranger. Then press Enter\n"); while(classchoosen == 0) { scanf("%s", class); if(strcmp(class, "W") == 0) { classchoosen = 1; class = "Warrior"; } if(strcmp(class, "M") == 0) { classchoosen = 1; class = "Mage"; } if(strcmp(class, "R") == 0) { classchoosen = 1; class = "Ranger"; } if(classchoosen == 0) { class = "undefined"; } printf("So you wanna play as a %s? Enter y/n", class); classchoosen = 0; //For testing, remove later } while(1) { /* Irrelevant stuff */ } } 

И это дает мне следующие ошибки:

 damagecalc.c:44:13: error: expected identifier class -> "warrior"; ^ damagecalc.c:49:10: error: array type 'char [30]' is not assignable class = "mage"; ~~~~~ ^ damagecalc.c:54:10: error: array type 'char [30]' is not assignable class = "ranger"; ~~~~~ ^ damagecalc.c:58:10: error: array type 'char [30]' is not assignable class = "warlock"; ~~~~~ ^ 4 errors generated. 

Я знаю, что могу просто распечатать имя classа сразу после сравнения строк, но эта штука действительно прослушивает меня, и я хочу знать, почему это не работает.

PS: Пожалуйста, простите меня за любые очевидные ошибки, которые я могу сделать, я только недавно попал в программирование ПК после того, как пару лет работал над uC.

Да, массивы char не назначаются так же, как и все массивы. Вы должны использовать strcpy например

 strcpy(class, "Warrior"); 

и так далее.

Кроме того, вам не нужно объявлять char class[30]; самая длинная строка, которую я вижу в вашем коде, является "undefined" поэтому

 char class[10]; 

должно быть нормально, 9 символов "undefined" + 1 нуль завершающего байта '\0' .

И вы должны предотвратить переполнение буфера с помощью scanf таким образом

 scanf("%1s", class); 

так как вы только хотите прочитать 1 символ, также сравнение должно быть проще просто

 if (class[0] == 'M') strcpy(class, "Mage"); 

или даже thsi было бы более читаемым

 classchosen = 1; switch (class[0]) { case 'M': strcpy(class, "Mage"); break; case 'R': strcpy(class, "Ranger"); break; case 'W': strcpy(class, "Warrior"); break; default: classchosen = 0; } 

и, наконец, проверить, что scanf самом деле преуспел, он возвращает количество аргументов, которые совпадают, поэтому в вашем случае проверка будет похожа

 if (scanf("%1s", class) == 1) ... 

см. это не только для символьного массива, это подразумевает для всех типов массивов, но вопрос возникает, почему ?, когда мы можем назначить другую переменную, почему бы не массировать вещь: – предположим, что у нас есть:

 int a[size]; a = {2,3,4,5,6}; 

потому что здесь имя среднего адреса массива первого расположения массива

 printf("%p",a); // let suppose the output is 0x7fff5fbff7f0 

Мы говорим об этом

0x7fff5fbff7f0 = что-то; что неверно, да, мы можем сделать [0] = что-то, теперь он говорит присваивать значение массива в 0-ом месте.

  class = "Ranger"; 

должно быть

 strcpy(class,"Ranger"); 

Исправьте то же самое во всех местах. массивы char не могут быть назначены

switch class = "Warrior"; to strcpy(class, "warrior");

switch class = "Mage"; to strcpy(class, "Mage");

switch class = "Ranger"; to strcpy(class, "Ranger");

switch class = "undefined"; to strcpy(class, "undefined");

и он должен работать!