C语言中的动态字符串数组结构
我必须用c写一个函数,它将返回一个动态字符串数组。以下是我的要求:C语言中的动态字符串数组结构,c,C,我必须用c写一个函数,它将返回一个动态字符串数组。以下是我的要求: 我有10个不同的检查函数,它们将返回true或false以及相关的错误文本。(错误文本字符串也是动态的) 我的函数必须收集结果(真或假)+错误字符串,它将被称为n个检查函数。因此,我的函数必须收集n个结果,并最终将字符串的动态数组返回给其他函数 您可以使用malloc()分配任意长度的数组(就像Java中的“new”),并使用realloc()使其增长或收缩 您必须记住使用free()释放内存,因为在C中没有garbarage
- 我有10个不同的检查函数,它们将返回true或false以及相关的错误文本。(错误文本字符串也是动态的)
- 我的函数必须收集结果(真或假)+错误字符串,它将被称为n个检查函数。因此,我的函数必须收集n个结果,并最终将字符串的动态数组返回给其他函数
#包括
#包括
int main(){
字符*字符串;
//假设我们有一个8个字符的初始字符串
string=malloc(sizeof(char)*9);//九,因为我们需要8个字符加上一个\0来终止字符串
strcpy(字符串,“12345678”);
//现在我们需要将字符串扩展到10个字符(加上\0的一个字符)
string=realloc(string,sizeof(char)*11);
//您可以检查字符串是否与NULL不同。。。
//现在我们添加一些字符
strcat(字符串,“90”);
// ...
//在某个时候,如果不希望内存泄漏,您需要释放内存
自由(弦);
// ...
返回0;
}
编辑2:
这是分配和展开指向字符的指针数组(字符串数组)的示例
#包括
int main(){
//字符串数组
字符**消息;
char*指向字符串的指针;
char*指向字符串的指针;
无符号大小=0;
//初始尺寸1
messages=malloc(sizeof(char*);//注意我为指向char的1个指针分配了空间
尺寸=1;
// ...
消息[0]=指向字符串0的指针;
//我们扩展为包含2个字符串(实际上是2个指针)
大小++;
messages=realloc(messages,sizeof(char*)*size);
消息[1]=指向字符串的指针\u\u 1;
// ...
免费(信息);
// ...
返回0;
}
考虑创建适合您的问题的适当类型。例如,可以创建一个包含指针和sn整数长度的结构来表示动态数组
examine()
函数和你拥有的函数
写作?(让我们称之为
validate()
)inspect()
函数,这是否意味着通过validate()
返回的数组中最多有10条消息/结果- C中没有与Array.length等效的值:必须提供一个side整数值来存储数组的有效大小
- C数组不能“增长”:当数组增长或收缩时,必须使用指针并分配/重新分配数组开始指针所指向的内存
- 您应该已经知道C中没有类或方法的概念,但是您可以使用
、struct
和函数指针向C程序添加某种面向对象/泛型行为typedef
- 根据您的需要和义务,数组可能是一种很好的方法,也可能不是:也许您应该尝试找出一种在C中构建/找到java List接口等价物的方法,以便添加,删除/销毁或排序检查结果元素,而无需在每次操作结果集时重复内存分配/重新分配/释放代码(您或许应该发送一个包含structs/inspect函数的头文件来描述您目前所做的工作,并更准确地表达您的需求,以便我们能够引导您走向正确的方向)
请毫不犹豫地提供更多信息或询问有关上述项目符号点的详细信息;)那么您到目前为止尝试了什么?您能给我们一个检查函数的标题吗?使用malloc时,请将size参数设置为#of elements*sizeof(type)谢谢fernando。如果你能为此提供一个示例代码,那就太好了。
strcpy()
是癌症。使用strncpy()
来避免缓冲区溢出。@Jonathan-Mehmemcpy
更好。如果您可以保证nul终止,strcpy
在最坏的情况下有点效率低下。如果您不能保证终止,并且您知道数据的长度,strncpy
的效率将略高于memcpy
。如果您不知道数据的长度和/或可能包含nul字符,strncpy
同样危险/无用。@Jonathan-strncpy
永远不合适。如果缓冲区对于数据来说太小,则不能保证nul终止;如果缓冲区对于数据来说太大,则写入无用的额外零。这是一个两败俱伤的提议。使用memcpy
。
#include <stdlib.h>
#include <string.h>
int main(){
char * string;
// Lets say we have a initial string of 8 chars
string = malloc(sizeof(char) * 9); // Nine because we need 8 chars plus one \0 to terminate the string
strcpy(string, "12345678");
// Now we need to expand the string to 10 chars (plus one for \0)
string = realloc(string, sizeof(char) * 11);
// you can check if string is different of NULL...
// Now we append some chars
strcat(string, "90");
// ...
// at some point you need to free the memory if you don't want a memory leak
free(string);
// ...
return 0;
}
#include <stdlib.h>
int main(){
// Array of strings
char ** messages;
char * pointer_to_string_0 = "Hello";
char * pointer_to_string_1 = "World";
unsigned size = 0;
// Initial size one
messages = malloc(sizeof(char *)); // Note I allocate space for 1 pointer to char
size = 1;
// ...
messages[0] = pointer_to_string_0;
// We expand to contain 2 strings (2 pointers really)
size++;
messages = realloc(messages, sizeof(char *) * size);
messages[1] = pointer_to_string_1;
// ...
free(messages);
// ...
return 0;
}