Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的动态字符串数组结构_C - Fatal编程技术网

C语言中的动态字符串数组结构

C语言中的动态字符串数组结构,c,C,我必须用c写一个函数,它将返回一个动态字符串数组。以下是我的要求: 我有10个不同的检查函数,它们将返回true或false以及相关的错误文本。(错误文本字符串也是动态的) 我的函数必须收集结果(真或假)+错误字符串,它将被称为n个检查函数。因此,我的函数必须收集n个结果,并最终将字符串的动态数组返回给其他函数 您可以使用malloc()分配任意长度的数组(就像Java中的“new”),并使用realloc()使其增长或收缩 您必须记住使用free()释放内存,因为在C中没有garbarage

我必须用c写一个函数,它将返回一个动态字符串数组。以下是我的要求:

  • 我有10个不同的检查函数,它们将返回true或false以及相关的错误文本。(错误文本字符串也是动态的)
  • 我的函数必须收集结果(真或假)+错误字符串,它将被称为n个检查函数。因此,我的函数必须收集n个结果,并最终将字符串的动态数组返回给其他函数

您可以使用malloc()分配任意长度的数组(就像Java中的“new”),并使用realloc()使其增长或收缩

您必须记住使用free()释放内存,因为在C中没有garbarage收集器

检查:

编辑:

#包括
#包括
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()

  • 您说您有10个
    inspect()
    函数,这是否意味着通过
    validate()
    返回的数组中最多有10条消息/结果

  • 我是一名具有C语言背景的Java程序员,因此我可以为您重点介绍以下几点:

    • C中没有与Array.length等效的值:必须提供一个side整数值来存储数组的有效大小

    • C数组不能“增长”:当数组增长或收缩时,必须使用指针并分配/重新分配数组开始指针所指向的内存

    • 您应该已经知道C中没有类或方法的概念,但是您可以使用
      struct
      typedef
      和函数指针向C程序添加某种面向对象/泛型行为

    • 根据您的需要和义务,数组可能是一种很好的方法,也可能不是:也许您应该尝试找出一种在C中构建/找到java List接口等价物的方法,以便添加,删除/销毁或排序检查结果元素,而无需在每次操作结果集时重复内存分配/重新分配/释放代码(您或许应该发送一个包含structs/inspect函数的头文件来描述您目前所做的工作,并更准确地表达您的需求,以便我们能够引导您走向正确的方向)


    请毫不犹豫地提供更多信息或询问有关上述项目符号点的详细信息;)

    那么您到目前为止尝试了什么?您能给我们一个检查函数的标题吗?使用malloc时,请将size参数设置为#of elements*sizeof(type)谢谢fernando。如果你能为此提供一个示例代码,那就太好了。
    strcpy()
    是癌症。使用
    strncpy()
    来避免缓冲区溢出。@Jonathan-Meh
    memcpy
    更好。如果您可以保证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;
    }