在if条件下改变字符串变量

时间:2018-02-11 16:57:40

标签: c arrays string variables

我使用此程序将输入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;
}

它为带有数组类型的表达式赋予了错误赋值。请帮忙

3 个答案:

答案 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)

基本上有两种不同的方式可以考虑/谈论字符串:

  1. '\0'字符终止的字符数组。 (这是C中字符串的正式定义。)

  2. 作为指向字符的指针,或char *,指向字符序列(数组)的第一个字符,以'\0'字符结尾。

  3. 所以你可以声明一个数组,并将一个字符串复制到其中:

    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是一个字符串为数组,因此您无法分配它。你有两个选择:

    1. 使用strcpy将字符串复制到其中:

      if (mm == 1) { strcpy(mname, "January"); }

    2. mname声明为指针:

      char *mname;

      ...

      if (mm == 1) { mname = "January"; }

    3. 附录:为了完整起见,我应该再提一点。

      当您使用以下任一方式初始化指向字符串的指针时:

      char *pointerstring = "Goodbye";
      char * pointerstring2;
      pointerstring2 = "for now";
      

      这些字符串"Goodbye""for now" 只读。你无法修改它们。所以,如果你尝试做类似

      的事情
       strcpy(pointerstring, pointerstring2);    /* WRONG: overwriting constant string */
      

      它不起作用,因为你试图将第二个字符串复制到存储第一个字符串的内存中,但该内存不可写。

      因此,当您使用数组时,您无法使用赋值,您必须使用strcpy;但是当你使用指针时,你可以使用赋值,而你可能无法调用strcpy