Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
如何加载';他是Stuct[i]的成员吗?_C_Struct_Char - Fatal编程技术网

如何加载';他是Stuct[i]的成员吗?

如何加载';他是Stuct[i]的成员吗?,c,struct,char,C,Struct,Char,假设我们有这个结构 struct Foo{ int FooLength; //length of Foo char FooChar[4]; }; 然后大体上我们有 int sizeFoo = 100; struct Foo myFooList[sizeFoo]; 为FooChar输入数据的最佳方式是什么?是strncpy,还是memcpy,还是snprintf,还是sprintf 我想做的是 myFooList[0].FooLength = 3; myFooLis

假设我们有这个结构

struct Foo{
    int FooLength;       //length of Foo
    char FooChar[4];
};
然后大体上我们有

int sizeFoo = 100; struct Foo myFooList[sizeFoo];
FooChar
输入数据的最佳方式是什么?是
strncpy
,还是
memcpy
,还是
snprintf
,还是
sprintf

我想做的是

myFooList[0].FooLength = 3;
myFooList[0].FooChar = "dog";
myFooList[1].FooLength = 3;
myFooList[1].FooChar = "cat";
.
.
.
使用正确的语法,因为在C中不能仅使用=“string”;在这里,我不确定什么是最好的方法?我已经看过类似的主题,但我只是更加困惑于
strncpy
sprintf
如何不好,或者您必须在末尾添加
\0
或其他一些细节,这使得选择要做的事情更加困难


另外,如果已经知道所有的
my傻瓜列表[]
值(它们是常量或静态的),是否有一种方法可以像初始化任何其他数组一样进行初始化?

您的整数赋值是正确的,但字符串赋值是不正确的。以下是正确的方法:

myFooList[0].FooLength = 3;
strcpy( myFooList[0].FooChar, "dog");
myFooList[1].FooLength = 3;
strcpy(myFooList[1].FooChar, "cat");

整数赋值正确,但字符串赋值不正确。以下是正确的方法:

myFooList[0].FooLength = 3;
strcpy( myFooList[0].FooChar, "dog");
myFooList[1].FooLength = 3;
strcpy(myFooList[1].FooChar, "cat");
为FooChar输入数据的最佳方式是什么?会不会是strncpy, 或者memcpy,或者snprintf,或者sprintf。。。 但我只是对strncpy或sprintf如何不好感到更加困惑 或者,您必须在结尾添加\0或其他一些详细信息 使选择要做的事情更加困难

如果你不想终止nul字节,memcpy是个不错的选择。我真的不明白你的问题是什么

另外,如果my傻瓜[]的所有值都已经知道(它们是常量 (静态)是否有一种方法可以像其他方法一样进行初始化 阵列

在您的示例中,没有,因为您使用了无法初始化的用户。但您可以执行以下操作:

#include <stdio.h>

struct Foo {
  int FooLength; // length of Foo
  char FooChar[4];
};

int main(void) {
  struct Foo myFooList[] = {{3, "dog"}, {3, "cat"}};
  size_t size = sizeof myFooList / sizeof *myFooList;
}
#包括
结构Foo{
int-jundength;//Foo的长度
char-FooChar[4];
};
内部主(空){
结构Foo my傻瓜[]={{3,“狗”},{3,“猫”};
size\u t size=sizeof my傻瓜列表/sizeof*my傻瓜列表;
}
为FooChar输入数据的最佳方式是什么?会不会是strncpy, 或者memcpy,或者snprintf,或者sprintf。。。 但我只是对strncpy或sprintf如何不好感到更加困惑 或者,您必须在结尾添加\0或其他一些详细信息 使选择要做的事情更加困难

如果你不想终止nul字节,memcpy是个不错的选择。我真的不明白你的问题是什么

另外,如果my傻瓜[]的所有值都已经知道(它们是常量 (静态)是否有一种方法可以像其他方法一样进行初始化 阵列

在您的示例中,没有,因为您使用了无法初始化的用户。但您可以执行以下操作:

#include <stdio.h>

struct Foo {
  int FooLength; // length of Foo
  char FooChar[4];
};

int main(void) {
  struct Foo myFooList[] = {{3, "dog"}, {3, "cat"}};
  size_t size = sizeof myFooList / sizeof *myFooList;
}
#包括
结构Foo{
int-jundength;//Foo的长度
char-FooChar[4];
};
内部主(空){
结构Foo my傻瓜[]={{3,“狗”},{3,“猫”};
size\u t size=sizeof my傻瓜列表/sizeof*my傻瓜列表;
}

如果您的输入总是3个字符,您可以使用strcpy,否则使用strncpy(my傻瓜[0]。FooChar,“dog”,3)。如果使用
strncpy
,则必须添加终止空字符
strcpy
将自动添加终止空字符,就像VHS在其答案中所做的那样。在这两种情况下,您仍然应该验证您的输入没有超过最大长度。要查找字符串的长度(即字符数直到第一个空字符),可以使用
strlen
。要确定
字符a[]
的容量,可以使用
\u countof(a)
。不要忘记其中一个必须是
'\0'

memcpy
也可以工作,但用字符串来实现这一点并不常见

您不会在这里使用
sprintf
<当您需要在运行时使用动态数据创建唯一字符串时,通常会使用code>sprintf。这不是你在这里做的。如果您对.NET有任何经验,那么它就是C语言中的
string.Format

要初始化“Foo”数组,只需编写一个函数即可。即使您在一行中找到了语法,也很难阅读和维护。这里有一个未经验证的示例,我将把该任务留给您

myFooList[0].FooLength = 3;
strncpy(myFooList[0].FooChar, "dog", 3);
myFooList[0].FooChar[3] = '\0';

myFooList[1].FooLength = 3;
strncpy(myFooList[1].FooChar, "cat", 3);
myFooList[1].FooChar[3] = '\0';

如果您的输入始终为3个字符,则可以使用
strcpy
,否则可以使用
strncpy(my傻瓜[0]。FooChar,“dog”,3)
。如果使用
strncpy
,则必须添加终止空字符
strcpy
将自动添加终止空字符,就像VHS在其答案中所做的那样。在这两种情况下,您仍然应该验证您的输入没有超过最大长度。要查找字符串的长度(即字符数直到第一个空字符),可以使用
strlen
。要确定
字符a[]
的容量,可以使用
\u countof(a)
。不要忘记其中一个必须是
'\0'

memcpy
也可以工作,但用字符串来实现这一点并不常见

您不会在这里使用
sprintf
<当您需要在运行时使用动态数据创建唯一字符串时,通常会使用code>sprintf。这不是你在这里做的。如果您对.NET有任何经验,那么它就是C语言中的
string.Format

要初始化“Foo”数组,只需编写一个函数即可。即使您在一行中找到了语法,也很难阅读和维护。这里有一个未经验证的示例,我将把该任务留给您

myFooList[0].FooLength = 3;
strncpy(myFooList[0].FooChar, "dog", 3);
myFooList[0].FooChar[3] = '\0';

myFooList[1].FooLength = 3;
strncpy(myFooList[1].FooChar, "cat", 3);
myFooList[1].FooChar[3] = '\0';

不能分配字符串。您正在尝试分配字符串文字的地址<代码>我的傻瓜[0]。FooChar=“dog”应该是strcpy(my傻瓜[0].FooChar,“dog”)请始终记住,必须为nul终止字符留出空间(在这里是这样做的,但不清楚这是否是有意的)