如何加载一个char [],它是Stuct [i]的成员?

时间:2017-10-14 00:56:03

标签: c struct char

假设我们有这个结构

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

然后在主要我们有

int sizeFoo = 100; struct Foo myFooList[sizeFoo];

FooChar输入数据的最佳方式是什么?会strncpymemcpysnprintf还是sprintf

我希望做的是像

myFooList[0].FooLength = 3;
myFooList[0].FooChar = "dog";
myFooList[1].FooLength = 3;
myFooList[1].FooChar = "cat";
.
.
.

语法正确,因为在C中你不能只是=“string”;在这里,我不确定最好的方法是什么?我看过类似的主题,但我对strncpysprintf不好或者你必须在最后添加\0或其他一些细节感到困惑选择做什么更难。

此外,如果myFooList[]的所有值都已知道(它们是常量或静态),有没有一种方法可以像其他任何数组一样进行初始化?

3 个答案:

答案 0 :(得分:0)

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

   public class NewMainModelName
    {
        public MainModelName model1 { get; set; }
        public PartialModelName pmodel1{ get; set; }
    }

答案 1 :(得分:0)

  

为FooChar输入数据的最佳方式是什么?会strncpy,   或memcpy,或snprintf,还是sprintf? ...   但我对strncpy或sprintf不好的方式感到困惑   或者你必须在最后添加\ 0或其他一些细节   让选择做什么更困难。

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

  

此外,如果myFooList []的所有值都已知道(它们是const   或静态)是否有一种方法可以像其他人一样进行初始化   阵列

在您的示例中,不,因为您使用无法初始化的VLA。但你可以做到以下几点:

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

答案 2 :(得分:0)

如果您的输入始终为3个字符,则可以使用strcpy,否则请使用strncpy(myFooList[0].FooChar, "dog", 3)。如果使用strncpy,则必须添加终止空字符。 strcpy会自动添加终止空字符,就像VHS在答案中一样。在任何一种情况下,您仍应验证输入是否超过最大长度。要查找字符串的长度(即直到第一个空字符的字符数),您将使用strlen。要确定char a[]的容量,您可以使用_countof(a)。不要忘记其中一个必须是'\0'

memcpy也可以,但用字符串做这件事是不寻常的。

你不会在这里使用sprintf。当您需要在运行时使用动态数据创建唯一字符串时,通常会使用sprintf。这不是你在这里做的。如果您有使用.NET的经验,那么它等同于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';