可变长度的字符
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)
。
注意:n
是 struct
(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'
终止符需要一个字符)。
您可以使用以下两种解决方案之一:
使用灵活的数组成员,或者 使用指针。第一个解决方案让您将name
与struct
的其余部分保持在一起,但您无法将这些struct
s 组成数组:
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 <string>
仅在 C++ 中可用。以上是关于可变长度的字符的主要内容,如果未能解决你的问题,请参考以下文章