【问题标题】:How to change Char array value in c?如何在c中更改Char数组值?
【发布时间】:2020-04-08 13:44:15
【问题描述】:

我想改变char数据的值 /* 更改默认值时出错,还有其他方法吗*/

char name[]="Ronaldo";
int choice='0';

    printf("Select Player");
    printf("1.Messi\n 2.Suarez\n 3.Neymer\n 4.Dembele\n");
    switch(choice)
    case 1:
            printf("Messi is Selected");

            **Error Position**

            name="Messi";
            printf("Player changd to %s",name);
            break;

    case 5:
            printf("Exit");
            name="Muller";
            exit(1)

更改玩家名称

【问题讨论】:

  • 错误:赋值给数组类型的表达式
  • 您正在将字符分配给整数... int choice='0'; 这是第一个错误... 而不是写int choice=0; 如果您正在打印,还可以考虑使用puts() 而不是printf()始终相同的文本。
  • @71GA 这不一定是错误。至少是合法的 C 代码。

标签: c arrays string char


【解决方案1】:

1.

name="Messi";

除非在初始化时,否则您不能为 char 数组分配字符串,这是通过以下方式完成的:

char name[]="Ronaldo";

而是使用strcpy()(标题string.h)-> strcpy(name,"Messi");

考虑数组name 需要能够保存新分配的字符串+空终止符,在这种情况下提供它是因为字符串"Ronaldo" 的字符比以下任何一个都多。如果不是这种情况,您必须使用适当数量的字符来定义name,或者选择一个比其他任何人都大的名称,否则程序会导致内存中的数据溢出。

2.

请注意,如果 choice 始终为 0,则 switch 语句没有意义,因为您从未读取过 choice 的输入。

casesswitch 也没有被 {} 包围,这应该会给你一个编译错误。

3.

choice 由一个字符初始化。虽然这是允许的,但在这种情况下没有意义,并且会使代码的读者感到困惑。而是使用int choice = 0;


更正的代码:

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

int main(void)
{
   char name[]="Ronaldo";
    int choice=0;

    printf("Select Player\n");
    printf("1.Messi\n2.Suarez\n3.Neymar\n4.Dembele\n5.Muller\n\n");

    scanf("%d",&choice);

    switch(choice)
    {

    case 1:
            printf("\nMessi is Selected");
            strcpy(name,"Messi");

            break;


    case 2:
            printf("\nSuarez is Selected");
            strcpy(name,"Suarez");

            break;


    case 3:
            printf("\nNeymar is Selected");
            strcpy(name,"Neymar");

            break;    

    case 4:
            printf("\nDembele is Selected");
            strcpy(name,"Dembele");

            break;    


    case 5:
            printf("\nMuller is Selected");
            strcpy(name,"Muller"); 
           
            break;               

    default:
            printf("Exit");
            exit(1);
    } 

    printf("\nPlayer changed to %s",name);   
    return 0;
}

输出:

/a.out
Select Player  
1.Messi      
2.Suarez      
3.Neymar             
4.Dembele 
5.Muller 
  
2        // Input from User

Suarez is Selected               
Player changed to Suarez      

【讨论】:

    【解决方案2】:

    问题是

    char name[]="Ronaldo";
    

    给你一个字符数组。 这不是你想要的,因为 char 数组不允许简单的赋值。对于 char 数组,您需要使用 strcpy

    但是 - 你想要的是一个指向 char 的指针 - 比如:

    char* name="Ronaldo";
    

    然后你可以做一些简单的任务,比如:

    char* name="Ronaldo";
    printf("My player is %s\n", name);
    name = "Eriksen";
    printf("My player is %s\n", name);
    

    一个字符指针可以直接赋值为指向任何字符串字面量。

    除此之外,您永远不会得到任何用户输入。

    注意switch 语句有一个default- 类似:

    switch(choice)
    {
        case 1:
            // do some things for input 1
        break;
    
        case 2:
            // do some things for input 2
        break;
    
        default:
            // do some things for all other values
        break;
    }
    

    【讨论】:

    • 有趣,我删除了我的评论。因此,为了不在内存中的任何地方获得悬空字符串文字,唯一的方法可能是分别分配每个字符和终止空字符。
    • @RobertSsupportsMonicaCellio 正确,但最终可能会使用比“悬空”字符串文字更多的内存。我还没有测试过——这只是我的猜测。
    【解决方案3】:

    你错过了main() 和很多其他的东西......它可以像这样工作......

    #include <stdio.h>
    #include <string.h>
    
    
    int main(void){
    
    char name[20] = "Ronaldo";
    int choice;
    
        printf("Select Player:\n\n");
        printf("\t1.Messi\n\t2.Suarez\n\t3.Neymer\n\t4.Dembele\n\n");
    
        scanf("%d", &choice);
    
        switch(choice){
        case 1:
                strcpy(name, "Messi");
                printf("\t%s is selected...\n", name);
                break;
    
        case 2:
                strcpy(name, "Suarez");
                printf("\t%s is selected...\n", name);
                break;
    
        case 3:
                strcpy(name, "Neymer");
                printf("\t%s is selected...\n", name);
                break;
    
        case 4:
                strcpy(name, "Dembele");
                printf("\t%s is selected...\n", name);
                break;
    
        default:
                puts("\tWrong selection");
        }
    
    return(0);
    
    }
    

    【讨论】:

      【解决方案4】:

      您的代码中有几个错误:

      > 字符名[]="罗纳尔多";
      这将创建应具有预定义长度的字符数组。

      > int 选择='0';
      整数类型不能存储'0'

      首先更正它们,然后提供有关您要查找的内容的更多信息。

      【讨论】:

      • 首先,char name[]="Ronaldo"; 等于 char name [8]; strcpy(name, "Ronaldo"); - 编译器自动确定长度 - 所以 1. 不正确。其次,实际上可以给int分配一个字符,所以“整数类型不能存储'0'”是错误的。
      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2014-05-09
      • 2018-11-19
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2021-03-28
      相关资源
      最近更新 更多