如何创建字符串对数组?

How to create array of pairs of strings?

我是 C 的新手,一段时间以来我一直在尝试创建和打印字符串对数组,但一直出错。这是我希望数组的样子:

[[str1, str2], [str3, str4], ...]

这是我试过的方法:

...
char str1[51], str2[51];
char *pairs[amount][2][51];
for (int i = 0; i < amount; i++) {
    scanf("%s %s", str1, str2);
    // assign str at ith index of pairs and 0th/1st index within pair
    *pairs[i][0] = str1;
    *pairs[i][1] = str2;
}
// print pairs in backwards order
for (int i = 0; i < amount; i++) {
    printf("%s %s", *pairs[i][1], *pairs[i][0]);
}

输入:

1 2
3 4
5 6

输出:

6 5
6 5
6 5

我对此的解释是声明一个指向字符串对的指针的 char 数组,每个字符串包含超过 50 个字符,然后将字符串分配给每一对并向后打印它们。显然我在这里做错了什么,但是呢?好像只有最后一对被访问了。

我知道我可以在输入字符串时向后打印字符串,但我正在努力更好地理解数组和声明。

您的问题是:

*pairs[i][0] = str1;

这会将 str1 的引用(而不是值)复制到 pairs[i][0]。 如果你想复制这个值,你应该使用 string.h 头文件中的 strcpy() 函数。 另一种解决方案是以下示例:

一个没有结构的例子

#include <stdio.h>

int main() {
    char list_of_pairs[3][2][51];
    printf("Enter your pairs:\n");

    for (int i = 0; i < 3; i++) {
        scanf(" %s %s", list_of_pairs[i][0], list_of_pairs[i][1]);
    }

    for (int i = 0; i < 3; i++) {
        printf("pair -> first: %s second: %s\n", list_of_pairs[i][0], list_of_pairs[i][1]);
    }

    return 0;
}

如果你想动态分配内存,数组指针是有意义的

#define MAXLENGTH 51

char (*addPair(size_t size, char (*array)[2][MAXLENGTH], const char *s1, const char *s2))[2][MAXLENGTH]
{
    array = realloc(array, ++size * sizeof(*array));

    if(array)
    {
        strncpy(array[size -1][0], s1, sizeof(array[0][0]));
        strncpy(array[size -1][1], s2, sizeof(array[0][0]));
        array[size -1][0][MAXLENGTH - 1] = 0;
        array[size -1][1][MAXLENGTH - 1] = 0;
    }
    return array;
}