我使用此程序将输入mm作为一年中的月份并打印出月份名称:
#include <stdio.h>
#include <string.h>
int main(){
int mm;
printf("input month ");
scanf("%d", &mm);
char mname[9];
if (mm == 1) {mname = "January";}
if (mm == 2) {mname = "February";}
if (mm == 3) {mname = "March";}
if (mm == 4) {mname = "April";}
if (mm == 5) {mname = "May";}
if (mm == 6) {mname = "June";}
if (mm == 7) {mname = "July";}
if (mm == 8) {mname = "August";}
if (mm == 9) {mname = "September";}
if (mm == 10) {mname = "October";}
if (mm == 11) {mname = "November";}
if (mm == 12) {mname = "December";}
printf("%d is month %s", mm, mname);
return 0;
}
它为带有数组类型的表达式赋予了错误赋值。请帮忙
答案 0 :(得分:3)
将 Michael Walz 两条好评并添加为答案:
#include <stdio.h>
#include <string.h>
void main(int argc, char** argv)
{
int mm = 0;
printf("Please enter a month number [1-12]:\n");
scanf("%d", &mm);
static const char* months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
if (mm >= 1 && mm <= 12)
{
printf("%d is month %s", mm, months[mm - 1]);
}
else
{
printf("You have entered an invalid month number %d\n", mm);
}
}
完成了有效性检查(在上面的评论中提到)。
希望它有所帮助。
干杯,
盖。
答案 1 :(得分:1)
基本上数组类型是常量指针,因此当您尝试为指针mname分配新值时,编译器会检测到错误。
您可以使用以下示例中的函数strcpy来解决问题:
if (mm == 1) {
strcpy(mname, "January");
}
答案 2 :(得分:1)
基本上有两种不同的方式可以考虑/谈论字符串:
由'\0'
字符终止的字符数组。 (这是C中字符串的正式定义。)
作为指向字符的指针,或char *
,指向字符序列(数组)的第一个字符,以'\0'
字符结尾。
所以你可以声明一个数组,并将一个字符串复制到其中:
char arraystring[10];
strcpy(arraystring, "Hello");
或者你可以声明一个数组,并在声明它时给它一个初始值:
char arraystring2[] = "world!";
或者你可以声明一个指针,并指向一个字符串:
char *pointerstring;
pointerstring = "Goodbye";
或者你可以声明一个指针,并给它一个初始值:
char *pointerstring2 = "for now";
值得了解这些“看起来”如何记忆:
+---+---+---+---+---+---+---+---+---+---+
arraystring: | H | e | l | l | o |\0 |\0 |\0 |\0 |\0 |
+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+
arraystring2: | w | o | r | l | d | ! |\0 |
+---+---+---+---+---+---+---+
+---------------+
pointerstring: | * |
+-------|-------+
| +---+---+---+---+---+---+---+---+
+---------> | G | o | o | d | b | y | e |\0 |
+---+---+---+---+---+---+---+---+
+---------------+
pointerstring2: | * |
+-------|-------+
| +---+---+---+---+---+---+---+---+
+---------> | f | o | r | | n | o | w |\0 |
+---+---+---+---+---+---+---+---+
现在,问题是,你无法在C 中分配数组。您可以指定指针。您还可以使用特殊规则(“数组和指针之间的等价”),当您在表达式中使用数组时,您获得的是指向数组第一个元素的指针。
因此,如果你想将一个字符串作为指针分配给另一个字符串作为指针,那么它可以工作:
pointerstring = pointerstring2;
如果您尝试将一个string-as-array分配给另一个字符串作为数组,则不起作用
arraystring = arraystring2; /* WRONG -- compiler complains, attempt to assign array */
如果要将一个字符串数组复制到另一个字符串,则必须调用strcpy
(当然,您必须担心溢出):
strcpy(arraystring, arraystring2);
您还可以将字符串作为数组分配给字符串作为指针:
pointerstring = arraystring;
这是有效的,因为编译器完全像处理
那样对待它pointerstring = &arraystring[0];
最后,如果您尝试将字符串作为指针分配给字符串作为数组,则这不起作用,因为您无法分配给数组:
arraystring = pointerstring; /* WRONG */
同样,只要您确定该字符串适合,您就可以调用strcpy
:
strcpy(arraystring, pointerstring); /* but worry about overflow */
在原始代码中,mname
是一个字符串为数组,因此您无法分配它。你有两个选择:
使用strcpy
将字符串复制到其中:
if (mm == 1) { strcpy(mname, "January"); }
将mname
声明为指针:
char *mname;
...
if (mm == 1) { mname = "January"; }
附录:为了完整起见,我应该再提一点。
当您使用以下任一方式初始化指向字符串的指针时:
char *pointerstring = "Goodbye";
char * pointerstring2;
pointerstring2 = "for now";
这些字符串"Goodbye"
和"for now"
只读。你无法修改它们。所以,如果你尝试做类似
strcpy(pointerstring, pointerstring2); /* WRONG: overwriting constant string */
它不起作用,因为你试图将第二个字符串复制到存储第一个字符串的内存中,但该内存不可写。
因此,当您使用数组时,您无法使用赋值,您必须使用strcpy
;但是当你使用指针时,你可以使用赋值,而你可能无法调用strcpy
。