可变长度的字符

Posted

技术标签:

【中文标题】可变长度的字符【英文标题】:Char with a variable length 【发布时间】:2015-02-26 22:20:58 【问题描述】:

是否可以定义一个可变长度的char

我有一个长度为 25 的char“name”(struct 名为“person”的成员),但我希望它是值 1 和 25 之间的可变长度,因为我想生成该char 的随机字符串具有不同的大小,并且并不总是具有相同的长度(25)。该方法的参数之一是sizeof(n.name)

注意:nstruct (struct person n)。

struct“人”是这样定义的:

    struct person
       int c; 
       char name[25];
    ;

有人吗?

【问题讨论】:

为什么不使用 char* 名称? 因为我想将字符的长度限制在 1 到 25 之间 【参考方案1】:
struct person
   int c; 
   char name[]; /* Variable length array */
;

我认为这应该符合您的目的。

否则你可以使用动态内存分配

char *name;

name是一个指针,应该分配内存,可以使用malloc()来完成

【讨论】:

可以将字符的长度限制在1到25之间吗? @Zombie 在将值写入name 之前验证字符串长度【参考方案2】:

您可以使用灵活的数组。它必须是结构的最后一个数据成员。

struct person
   int c; 
   char name[];
;

必须动态分配具有灵活数组的结构的内存。

来自 C 标准(6.7.2.1 结构和联合说明符)

灵活数组成员被忽略。特别是,尺寸 结构就像省略了灵活数组成员一样,除了 它可能有比省略所暗示的更多的尾随填充。豪夫 呃,当一个 . (或->)运算符有一个左操作数,即(一个指针 to) 具有灵活数组成员和右操作数的结构 命名该成员,它的行为就像该成员被替换为 最长的数组(具有相同的元素类型),不会使 结构大于被访问的对象;的偏移量 数组应保持灵活数组成员的数组,即使这 将不同于替换阵列。如果这个数组 没有元素,它的行为就好像它只有一个元素,但行为 如果尝试访问该元素或 生成一个越过它的指针。

还有一个使用的例子

20 EXAMPLE 2 After the declaration:
struct s  int n; double d[]; ;
the structure struct s has a flexible array member d. A typical way to use this is:
int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
and assuming that the call to malloc succeeds, the object pointed to by p behaves, for most purposes, as if
p had been declared as:
struct  int n; double d[m];  *p;
(there are circumstances in which this equivalence is broken; in particular, the offsets of member d might
not be the same).

或者你可以声明一个指向 char 的指针并只动态分配数组本身

struct person
       int c; 
       char *name;
    ;

【讨论】:

但是如果char“name”没有关联大小,我如何在我的方法中使用“sizeof(n.name)”作为参数来生成随机字符串? @Zombie 您应该将数组的大小存储在某个变量或结构的数据成员中。【参考方案3】:

char[25] 可让您存储长度在 0 到 24 之间(包括 0 到 24)的 C 字符串('\0' 终止符需要一个字符)。

您可以使用以下两种解决方案之一:

使用灵活的数组成员,或者 使用指针。

第一个解决方案让您将namestruct 的其余部分保持在一起,但您无法将这些structs 组成数组:

struct person
     int c; 
     char name[];
;

有关灵活数组成员的更多信息,请参阅this Q&A。您需要一个与 C99 兼容的编译器才能使用灵活的数组成员。

第二种解决方案需要更多的内存,但struct 的大小不会改变,因此可以在数组中使用它:

struct person
     int c; 
     char *name;
;

【讨论】:

【参考方案4】:

更好的方法是使用字符串库并声明字符串类型的变量“名称”。

#include<string>   

 struct person
           int c; 
           string name;
        ;

【讨论】:

这是一个关于C的问题; string#include &lt;string&gt; 仅在 C++ 中可用。

以上是关于可变长度的字符的主要内容,如果未能解决你的问题,请参考以下文章

跨多行拆分可变长度分隔字符串(SQL)

创建一个可变长度的字符串,填充一个重复的字符

测试精度 0.5 TensorFlow RNN 可变长度字符串

可变长度前缀字符串的操作

如何生成具有可变长度的随机字符串

使用python中的struct模块打包和解包可变长度数组/字符串