字符数组不可分配
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 个位置分配数组的值。
好的,所以我想在字符数组中保存一个单词,但它给我一个错误
这是我的代码
#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 个位置分配数组的值。