在 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];
因为aux
和taula
都是数组。但是在你的循环体中还有一个问题,那就是这个语句:
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])
.
我在 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];
因为aux
和taula
都是数组。但是在你的循环体中还有一个问题,那就是这个语句:
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])
.