将字符串写入字符数组时发生gcc错误

将字符串写入字符数组时发生gcc错误,c,arrays,gcc,C,Arrays,Gcc,当尝试将字符串分配给先前定义的char flightNumber[MAX]时,我被 错误:赋值从指针生成整数而不使用强制转换[-Werror] 这对我来说很奇怪,因为我没有使用指针,而且我相信我使用的是正确的强制类型,即charnotint。问题是,分配给flightNumber[MAX]的字符串需要根据用户在上面的选择中输入的内容进行更改 main()中的相关代码粘贴在下面 flightMenu(); scanf( "%d", &choice ); while ( choice

当尝试将字符串分配给先前定义的
char flightNumber[MAX]
时,我被
错误:赋值从指针生成整数而不使用强制转换[-Werror]
这对我来说很奇怪,因为我没有使用指针,而且我相信我使用的是正确的强制类型,即
char
not
int
。问题是,分配给
flightNumber[MAX]
的字符串需要根据用户在上面的选择中输入的内容进行更改

main()
中的相关代码粘贴在下面

flightMenu();
scanf( "%d", &choice );
    while ( choice < 1 || choice > 3 ) {
        printf( "That is not a valid flight option!" );
        flightMenu();
        scanf( "%d", &choice );
    }

char name[MAX];
char flightNumber[MAX];

printf( "Enter your first name: ");
scanf( "%s", &name[MAX] );

if ( choice == 1 ) {
    flightNumber[MAX] = "MIA1050";
    seatReservation( flight1 );
}

else if ( choice == 2 ) {
    flightNumber[MAX] = "BNA1050";
    seatReservation( flight2 );
}
else if ( choice == 3 ) {
    flightNumber[MAX] = "LAS1050";
    seatReservation( flight3 );
}
flightMenu();
scanf(“%d”,选择(&C);
而(选项<1 | |选项>3){
printf(“这不是一个有效的航班选项!”);
flightMenu();
scanf(“%d”,选择(&C);
}
字符名[MAX];
字符飞行数[MAX];
printf(“输入您的名字:”);
scanf(“%s”,&name[MAX]);
如果(选项==1){
航班号[MAX]=“MIA1050”;
海上观察(航班1);
}
else if(选项==2){
航班号[MAX]=“BNA1050”;
海上观察(航班2);
}
else if(选项==3){
航班号[MAX]=“LAS1050”;
海上观察(航班3);
}

看起来其他人也有类似的问题,但我不知道如何使用strcpy或指针。对于noob问题和糟糕的格式表示歉意,但我所做的一切似乎都无法修复错误,我想我忽略了一个非常简单的问题…

要复制字符串,您应该使用特殊的函数,如:

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

int main()
{
   char source[1000], destination[1000];

   printf("Input a string\n");
   gets(source);

   strcpy(destination, source);

   printf("Source string:      \"%s\"\n", source);
   printf("Destination string: \"%s\"\n", destination);

   return 0;
}
#包括
#包括
int main()
{
字符源[1000],目标[1000];
printf(“输入字符串\n”);
获取(源);
strcpy(目的地、来源);
printf(“源字符串:\%s\“\n”,源);
printf(“目标字符串:\%s\“\n”,目标);
返回0;
}

C库函数

char *strcpy(char *dest, const char *src) 
将src指向的字符串复制到dest

所以用它代替flightNumber[MAX]=“任何东西”


还有一个细节:strcpy()函数是在string.h头文件中定义的。

flightNumber[MAX]是一个字符数组。(堆栈上的本地缓冲区,最大大小),而您尝试分配的三个航班号是字符串文本

字符串文本计算为字符指针以分配它。(字符*)

因此,必须使用字符指针而不是此数组来分配文本


但是,如果您确实想将字符串文字复制到可变缓冲区,则可以使用strncpy()。

其他答案为您提供了复制字符串的好方法,但要回答为什么会出现错误的问题,请回答以下问题:
错误:赋值从指针生成整数而不使用强制转换[-Werror]

char flightNumber[MAX]
是字符数组的声明,但语句
flightNumber[MAX]=“MIA1050”表示“将
“MIA1050”
分配给
航班号中索引
MAX
处的元素”

这是错误的,原因有两个:

  • 您正在尝试将字符串文字指定给字符变量(
    flightNumber
    的元素是
    char
    s。这是编译器抱怨的类型不匹配:字符串文本的类型是
    const char*
    ,您将其分配给
    char
    类型的变量,因此隐式地将指针转换为整数类型(
    char
  • 这超出了范围:因为C数组的索引从零开始,所以
    flightNumber
    中的最大索引是
    MAX-1
  • 要使用数组,只需使用其名称(即
    flightNumber
    ),而不是声明中的名称+大小(即
    flightNumber[MAX]
    )。 现在,正如其他答案所指出的那样,作业
    flightNumber=“MIA1050”
    不能满足您的需要,因此您需要使用例如
    strncpy


    顺便说一句,为了减少缓冲区溢出的风险,请首选
    strncpy
    (采用长度参数)而不是不太安全的
    strcpy

    赋值
    flightnumber[MAX]=“MIA1050”;
    例如,试图分配文本字符串
    “MIA1050”
    (而不是字符串本身中的字符)到
    flightnumber
    数组中的
    MAX
    -第个元素位置(由于数组编号从0开始,这也将超过数组的末尾,因为数组中的最后一个元素位于索引
    MAX-1
    )。因为数组是
    char
    s,这是一种整数类型(不要与
    int
    混淆,后者也是一种整数类型,尽管通常大小不同),这也是将内存地址分配给标记为包含整数类型的位置的尝试,编译器将其视为您看到的错误

    要解决此错误并实现将字符串“分配”到存储位置的功能,有两种主要方法是将实际字符串复制到缓冲区中,或将字符串文本的地址传递到周围(上述问题的答案都已注意到这两种方法)对于前者,标准库工具(如
    strcpy
    )通常是将字符串从一个位置(如字符串文字的位置)复制到另一个位置(如示例中的
    flightnumber
    之类的缓冲区)的有效解决方案。对于后一种方法,您可以创建类型为
    char*
    的变量,而不是
    char
    数组,在这种情况下,您可以将字符串文字分配给该变量,因为分配字符地址的尝试将是正确的,因为变量的类型是正确的(指向-
    char

    哪种方法更可取取决于特定的应用程序以及对字符串文本所做的操作