如何加载';他是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终止字符留出空间(在这里是这样做的,但不清楚这是否是有意的)