Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
struct-C中的字符串文字_C - Fatal编程技术网

struct-C中的字符串文字

struct-C中的字符串文字,c,C,我需要在结构中封装一个文本字符串。下面的代码不会编译,但希望能说明我想做什么 struct my_struct { char* str = "string literal"; }; 您必须创建结构的实例,然后设置str成员。如果您计划使用字符串文字,您确实应该将其更改为const char*str struct my_struct { const char* str; }; int main() { struct my_struct s1; s1.str = "str

我需要在结构中封装一个文本字符串。下面的代码不会编译,但希望能说明我想做什么

struct my_struct
{
char* str = "string literal";
};

您必须创建结构的实例,然后设置
str
成员。如果您计划使用字符串文字,您确实应该将其更改为
const char*str

struct my_struct
{
    const char* str;
};

int main() {
    struct my_struct s1;
    s1.str = "string literal";

    /* or */
    struct my_struct s2 = {"string literal"};
}
我想你想要这个:

struct my_struct
{
    char* z;
};

// ...

struct my_struct s = {"string literal"};

不能初始化结构声明中的任何成员。创建结构实例时,必须初始化结构

struct my_struct
{
   char* str;
};

int main(int argc,char *argv[]) 
{
  struct my_struct foo = {"string literal"};
  ...
}
由于希望
str
成员引用字符串文本,因此最好将其设置为
const char*str
,因为您无法以任何方式修改字符串文本

或者 提供初始化功能 每次将结构初始化为已知状态

struct my_struct
{
   const char* str;
   int bar;
};

void init_my_struct(strut my_struct *s)
{
   s->str = "string literal";
   s->bar = 0;
}
int main(int argc,char *argv[]) 
{
  struct my_struct foo;
  init_my_struct(&foo);
或者使用预处理器初始化它: 或从已知对象复制:
正如已经给出的答案所表明的,结构声明和初始化必须分开,并且如果
my_struct
的所有实例都需要这样做,则必须一致地应用这一点。C++提供了更好的解决方案;如果可以使用C++编译,那么可以使用构造函数自动实现如下:

struct my_struct
{
    my_struct() : str("string literal"){}
    char* str ;
};

然后,对于my_struct的所有实例,str将在实例化时指向literal常量
“string literal”
。但是请注意,这是指向常量字符串的非常量指针。

不允许直接初始化。相反,我们可以做的是将它变成一个指针,并将它指向您想要的字符串

另一种方法,但仍然必须使用默认初始化实例来初始化新实例

struct my_struct
{
    const char * str;
} ms_def {
    .str = "value"
};

int main()
{
    my_struct obj = ms_def;
    printf("%s\n", obj.str);
    return 0;
}

哇!很多可能性。把它声明为静态变量怎么样?我试过了,但它不允许我这么做。静态变量不应该是
C结构的一部分吗。如果是,如何进行@Mahesh不,你不能在C中这样做(但是ideone.com/NjkPJ上的代码在C++中是可以的)是的,我知道这在
C++
中是可能的。另一个区别是B/W C和C++结构。谢谢,帮了大忙。谢谢你提供了各种init选项。我相信,唯一的答案是将字符串文字封装成结构,正如所陈述的。@ Iurii是真的,但是问题是标记C不C++。在2011,你可以在C问题上提到C++,这样就可以逃脱了。然而,这些天来,我希望这个答案会被大量否决。C和C++已经偏离了,但是对于一些保持它们严格分开的来说似乎是不可协商的。它今天充其量只能发表评论,可能仍会招致批评。
struct my_struct
{
    my_struct() : str("string literal"){}
    char* str ;
};
struct my_struct
{
    const char * str;
} ms_def {
    .str = "value"
};

int main()
{
    my_struct obj = ms_def;
    printf("%s\n", obj.str);
    return 0;
}