在c类型char的参数与参数类型const char不兼容

时间:2014-05-15 10:55:16

标签: c file char const

我目前在此代码块中收到标题错误。

void Option_3(char filename)
{ // profit for a month

    FILE *ptr_file;
    int num1, num2, num3;
    int a[31],b[31],c[31];
    int count=0;
    int i;


    ptr_file = fopen ( filename ,"r"); // error is here at file name

以后的主要

void main()
{
    int select;
    char filename;
    select = 0 ;
    filename = "April.txt"; //here the equals sign is giving me the error.

2 个答案:

答案 0 :(得分:2)

您需要将其声明为char *

void main()
{
    int select;
    char *filename; // Note the declaration
    select = 0 ;
    filename = "April.txt";

Option_3的参数声明中更改它:

void Option_3(char *filename)

原因是将其声明为char意味着您拥有一个变量来保存char类型的对象。 C中的字符序列是以'\0'结尾的字符数组,因此char *是正确的类型。

更新:更合适的是将其声明为const char *,因为您无法修改字符串文字。

答案 1 :(得分:2)

在C中,char类型与类型char *不兼容。仅仅因为它们是不同类型的。根据定义,char保证是最小的类型(大小为1)。 char *具有与任何指针相同的大小:它必须足够大以容纳内存地址:通常在32位系统上为4,在64位上为8。

您正在为声明为char的变量分配字符串常量,该赋值期望右侧参数类似于:

char foo = 'a';//single quotes indicate a char

或者,或许更多你的想法:

const char *foo = "April.txt";//double quotes indicative of char *

注意const存储类:字符串常量不会分配给变量,而filename的值将是字符串的内存地址,存储在读取中只有内存。因此,它是const:你不能改变它:

const char *foo = "foobar";
foo[0] = 'F';//<-- ERROR

为了能够修改该值,请写:

char foo[] = "foobar";
foo[0] = 'F';//Success!

这将创建一个足以容纳字符串的数组,并复制字符。当然,如果var的值可能会发生变化,那么它可能足够大以容纳更大的字符串,在这种情况下:

char foo[100] = "up to 100 chars";
strcat(foo, "!!");

或者,使用动态内存(但如果可能的话,请避免,因为堆慢,需要您更多关注):

char *foo = malloc(20);//begin with 20 chars
if (foo == NULL)
    exit( EXIT_FAILURE);//no memory could be allocated
strcpy(foo, "foobar");//copy string value into allocated memory
foo = realloc(foo, 50);//increase amount of allocated memory to hold 50
if (foo == NULL)//safety first:
    exit(EXIT_FAILURE);
strncat(foo, "some huuuuuuge string", 30);//strncat for safety, again

嗯,根据您的具体需求,有多种方法可以做事