C语言 向字符串数组中添加/追加字符串

cxfofazt  于 2023-01-20  发布在  其他
关注(0)|答案(3)|浏览(339)

假设我有一个数组,如下所示:

char arr[MAX_ARR_LENGTH][30] = {"Tom", "and", "Jerry" };

现在,我如何在数组的末尾添加一个新字符串呢?假设我想添加一个新元素“Jack”,这样数组看起来应该是:

char arr[MAX_ARR_LENGTH][30] = {"Tom", "and", "Jerry", "Jack" };

在C语言中如何实现这一点?
我尝试使用for循环,但因为它是一个2D数组,所以我无法找到正确的技术。

holgip5t

holgip5t1#

其他的答案都很好,也很正确,但要尽可能简单:

#define MAX_ARR_LENGTH 10
#define MAX_STR_LENGTH 30

char * arr[MAX_ARR_LENGTH][MAX_STR_LENGTH];
size_t arr_size = 0;  // number of elements in use

要添加元素:

if (arr_size < MAX_ARR_LENGTH)
  strcpy(arr[arr_size++], "Jill");
thtygnil

thtygnil2#

要在现有阵列有足够空间(MAX_ARR_LENGTH〉3)的情况下将数据复制到现有阵列中,请执行以下操作:

strcpy(arr[3], "Jack");

如果你要复制一个变量,首先用strlen()检查它的大小是否小于30。
不能扩展自动数组。您希望使用动态内存分配它:

// alternatively use calloc() or malloc()
char **arr = realloc(NULL, 30 * MAX_ARR_LENGTH);
if(!arr) {
  // handle error
}

char **tmp = realloc(arr, 31 * MAX_ARR_LENGTH);
if(!tmp) {
  // handle error
}
arr = tmp;

您还可以使用数组语法进行分配:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    char (*arr)[30] = malloc(sizeof(char[3][30]));
    strcpy(arr[0], "Tom");
    strcpy(arr[1], "and");
    strcpy(arr[2], "Jerry");
    char (*tmp)[30] = realloc(arr, sizeof(char[4][30]));
    if(!tmp) {
        // handle error
    }
    arr = tmp;
    strcpy(arr[3], "Jack");
}
zbdgwd5y

zbdgwd5y3#

在本声明中

char arr[MAX_ARR_LENGTH][30] = {"Tom", "and", "Jerry" };

声明了char[30]类型的MAX_ARR_LENGTH元素数组,并使用三个字符串常量对其进行了初始化。
我假设MAX_ARR_LENGTH的值大于3
在这种情况下,数组中所有其他没有被字符串常量显式初始化的元素都被隐式初始化为零,这意味着所有其他元素都被初始化为空字符串。
要向数组中追加一个新字符串,可以编写如下代码

#include <string.h>

//...

size_t i = 0;

while ( i < MAX_ARR_LENGTH && arr[i][0] != '\0' ) ++i;

if ( i < MAX_ARR_LENGTH ) strcpy( arr[i], "Jack" );

这是一个演示程序。

#include <stdio.h>
#include <string.h>

#define MAX_ARR_LENGTH 10

int main( void )
{
    char arr[MAX_ARR_LENGTH][30] = { "Tom", "and", "Jerry" };

    for (size_t i = 0; i < MAX_ARR_LENGTH && arr[i][0] != '\0'; i++)
    {
        printf( "%s ", arr[i] );
    }
    putchar( '\n' );

    size_t i = 0;

    while (i < MAX_ARR_LENGTH && arr[i][0] != '\0') ++i;

    if (i < MAX_ARR_LENGTH) strcpy( arr[i], "Jack" );

    for (size_t i = 0; i < MAX_ARR_LENGTH && arr[i][0] != '\0'; i++)
    {
        printf( "%s ", arr[i] );
    }
    putchar( '\n' );
}

程序输出为

Tom and Jerry
Tom and Jerry Jack

另一方面,最好从一开始就跟踪实际初始化的元素的数量。
这是另一个演示程序。

#include <stdio.h>
#include <string.h>

#define MAX_ARR_LENGTH 10

int main( void )
{
    char arr[MAX_ARR_LENGTH][30] = { "Tom", "and", "Jerry" };

    size_t n = 0;

    while (n < MAX_ARR_LENGTH && arr[n][0] != '\0') ++n;

    for (size_t i = 0; i < n; i++)
    {
        printf( "%s ", arr[i] );
    }
    putchar( '\n' );

    if (n < MAX_ARR_LENGTH) strcpy( arr[n], "Jack" );
    ++n;

    for (size_t i = 0; i < n; i++)
    {
        printf( "%s ", arr[i] );
    }
    putchar( '\n' );
}

程序输出与上图相同

Tom and Jerry
Tom and Jerry Jack

相关问题