将字符串写入char数组时出现gcc错误

时间:2016-10-09 19:45:25

标签: c arrays gcc

当尝试将字符串分配给先前定义的char flightNumber[MAX]时,我被击中了 error: assignment makes integer from pointer without a cast [-Werror] 这对我来说很奇怪,因为我没有使用指针,我相信我使用的是正确的演员类型,即char而不是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 );
}

看起来其他人有类似的问题,但我不知道如何使用strcpy或指针等内容。对于noob问题和糟糕的格式化道歉,但我没做什么似乎解决了错误,我的猜测是我忽略了一个非常简单的问题......

5 个答案:

答案 0 :(得分:1)

要复制字符串,您应该使用特殊功能,如:

#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;
}

http://www.programmingsimplified.com/c/source-code/c-program-copy-strings

答案 1 :(得分:0)

C库函数

char *strcpy(char *dest, const char *src) 

将src指向的字符串复制到dest。

因此请使用它而不是flightNumber [MAX] =“任何东西”;

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

答案 2 :(得分:0)

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

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

因此,您必须使用char指针而不是此数组来分配文字。

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

我建议你阅读C-tutorials或书籍,你必须理解用C做一些有用的事情的指示。

答案 3 :(得分:0)

其他答案为您提供了如何复制字符串的良好选择,但回答了有关您收到错误error: assignment makes integer from pointer without a cast [-Werror]的原因的问题:

char flightNumber[MAX];是char数组的声明,但语句flightNumber[MAX] = "MIA1050";表示“将"MIA1050"分配给MAX中索引为flightnumber的元素”。

由于两个不同的原因,这是错误的:

  1. 您正在尝试将字符串文字分配给字符变量(flightNumber的元素是char s。这是编译器抱怨的类型不匹配:字符串文字的类型是{ {1}},并且您将其分配给类型为const char*的变量,因此隐式地将指针转换为整数类型(char)。
  2. 它是越界的:char中最大的索引是flightNumber,因为C数组的索引从零开始。
  3. 要使用数组,只需使用其名称(即MAX-1),而不是声明中的名称+大小(即flightNumber)。 现在,正如其他答案所指出的那样,作业flightNumber[MAX]无法达到您想要的效果,因此您需要使用例如flightNumber = "MIA1050"

    顺便说一下,请将strncpy(需要一个长度参数)更改为较不安全的strncpy作为默认值,以降低缓冲区溢出的风险。

答案 4 :(得分:0)

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

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

哪种方法更可取决于特定的应用程序以及字符串文字的作用。但是,如果对字符串执行的唯一操作是打印出结果值或沿着这些行的某些内容,第二种方法(存储指向文字的地址而不是复制实际字符)可能更适合作为分配单个与创建缓冲区和执行内存区域副本相比,地址通常会比性能和内存存储更便宜(并不是除非程序执行相同的任务很多次,否则差异真的很大)

我还提出了一个建议,即在进一步深入研究之前,至少要理解C中指针管理的基础知识,因为这对于有效使用该语言非常重要。注意C风格字符串的布局也可能是一个好主意。