在 C 中重新分配多维字符数组的值

Reassign values of multidimensional char array in C

我在 C:

中有一个字符串数组
char taula[15][15];

这个table里面填的是一个文件的句子。一个单词最多可以有15个字母,一个词组最多可以有15个单词,这是它的内容:

{ "may", "the", "force", "be", "with", "you." }

现在,我需要更改单词的顺序,使它们不是这个顺序(但这对问题来说无关紧要)。

我是 C 的新手,但我的大脑是这样的(这是我在 Java 中会做的):

char aux[15] = "";
char frase_nova[15][15];
for(i=0;i<15;i=i+2) {
    aux = taula[i];
    taula[i] = taula[i+1];
    i++;
} 

我创建一个辅助变量来存储一个单词,并创建一个新数组来存储乱序的短语。我将第一个元素存储到 aux 变量。将第 0 个元素分配给第 1 个,最后我将 aux 分配给第 0 个元素,依此类推。这样我应该得到这个短语作为结果:

the may be force you. with

这导致我出错,所以我搜索了原因,然后使用 strcpy 将该代码更改为以下代码:

strcpy(aux,frase_nova[i+1]);
strcpy(frase_nova[i+1],frase_nova[i]);
strcpy(frase_nova[i],aux);
printf("%s",frase_nova[i]);

但这给我带来了一个奇怪的结果。我不明白指针和数组或其他任何东西正在发生。

the E�Ube you.��aE�URE�U

所以我想知道如何按照我想要的 ([i]) 顺序用原始多维字符数组的值填充新的多维字符数组。

要交换 6 个单词,您需要迭代 6 次,而不是 15 次。除非你只是想根据一些奇怪的模式来打乱单词。

循环也没有任何意义。我不明白你为什么要 i=i+2。此外,任何 for(int i=0; i<n; i++) 性质的循环都永远无法访问循环体中的项目 array[i+1],因为这会导致越界访问。

The maximum letters a word can have is 15.

那么你应该有单词的大小,在二维 char 数组中,作为 16 而不是 15

    char taula[15][16];
                   ^^

因为,在 C 语言中,字符串实际上是一维字符数组,以空字符结束 '[=20=]'。因此,您需要 space 来容纳空字符 '[=20=]'.

你的数组有 6 个字符串,即 3 对,所以你只需要迭代循环 3 次。但是,看看这个 for 循环:

for(i=0;i<15;i=i+2) {

它将迭代超过 3 次。你可以跟踪 2D 数组中的元素数量,并在循环条件中使用它而不是 15

如您所知,for 循环体中的这些语句将不起作用:

    aux = taula[i];
    taula[i] = taula[i+1];

因为auxtaula都是数组。但是在你的循环体中还有一个问题,那就是这个语句:

    i++;

您已经在循环中递增 i - i=i+2,如果您在循环体中执行 i++,那么在每次迭代中,i 将递增 3 并且不会给出预期的结果。您不需要在循环体中执行 i++

这些语句没有问题:

strcpy(aux,frase_nova[i+1]);
strcpy(frase_nova[i+1],frase_nova[i]);
strcpy(frase_nova[i],aux);
printf("%s",frase_nova[i]);

已提供

  • 如果数组frase_nova有元素{ "may", "the", "force", "be", "with", "you." },并且.
  • 循环变量i在每次迭代中只递增两次。

检查以下代码:

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

#define WORDS   15
#define WORD_SZ 16
#define NUM_ELE 6

int main(void) {
    char frase_nova[WORDS][WORD_SZ] = { "may", "the", "force", "be", "with", "you." };
    char aux[WORD_SZ] = "";

    for(int i = 0; i < NUM_ELE; i = i + 2) {
        // using your posted statements as it is
        strcpy(aux, frase_nova[i + 1]);
        strcpy(frase_nova[i + 1], frase_nova[i]);
        strcpy(frase_nova[i], aux);
        printf("%s ", frase_nova[i]);
    }
    printf ("\n");

    for (int  i = 0; i < NUM_ELE; ++i) {
        printf ("%s ", frase_nova[i]);
    }
    printf ("\n");

    return 0;
}

输出:

# ./a.out
the be you. 
the may be force you. with 

So I would like to know how to fill a new multidimensional char array with values of an original multidimensional char array

不清楚是要在交换原始数组的字符串之前还是在交换字符串之后,用原始多维 char 数组的值填充新的多维 char 数组。但是,无论你想要什么,你都可以通过这样做简单地实现它 - strcpy(frase_nova[i], taula[i]).