字符数组不可分配

char array not assignable

好的,所以我想在字符数组中保存一个单词,但它给我一个错误

这是我的代码

#include <stdio.h>
#include <time.h> 
#include <stdlib.h>
#include <string.h>

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 上工作了几年后最近才开始接触 PC 编程。

char 数组不可赋值,就像所有数组都不可赋值一样。例如,您应该使用 strcpy

strcpy(class, "Warrior");

等等。

此外,您不需要声明 char class[30]; 我在您的代码中看到的最长字符串是 "undefined" 所以

char class[10];

应该没问题,9 个字符 "undefined" + 1 个空终止字节 '[=22=]'.

你应该用这种方式 scanf 来防止缓冲区溢出

scanf("%1s", class);

既然你只想读取1个字符,那么比较应该更简单只是

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

甚至这样会更具可读性

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 是否真的成功了,它 returns 匹配的参数数量所以在你的情况下检查就像

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

应该是

strcpy(class,"Ranger");

在所有地方修复相同的问题。字符数组不可赋值

class = "Warrior";切换为strcpy(class, "warrior");

class = "Mage";切换为strcpy(class, "Mage");

class = "Ranger";切换为strcpy(class, "Ranger");

class = "undefined";切换为strcpy(class, "undefined");

它应该可以工作!

看到这不仅适用于字符数组,这意味着适用于所有类型的数组,但问题是为什么?当我们可以分配其他变量时,为什么不分配数组呢?问题是:- 假设我们有:

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

因为这里的数组名是指数组首地址的地址

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

我们是这么说的

0x7fff5fbff7f0 = 某物; 这是不正确的 是的,我们可以做 a[0] = something ,现在它说在第 0 个位置分配数组的值。