【问题标题】:Reassign values of multidimensional char array in C在C中重新分配多维char数组的值
【发布时间】:2022-01-05 13:32:04
【问题描述】:

我在 C 中有一个字符串数组:

char taula[15][15];

此表中填满了文件的句子。一个单词最多可以有 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]) 用原始多维 char 数组的值填充新的多维 char 数组。

【问题讨论】:

  • 字符串是数组。不能使用单个赋值语句复制数组。使用 string.h 中的字符串函数
  • @stark OP 似乎已经意识到了这一点。

标签: arrays c string char


【解决方案1】:

一个单词最多可以有 15 个字母。

那么你应该有字的大小,在 2D char 数组中,作为 16 而不是 15

    char taula[15][16];
                   ^^

因为在 C 语言中,字符串实际上是由空字符 '\0' 终止的一维字符数组。因此,您需要空间来容纳空字符'\0'

您的数组有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 

所以我想知道如何用原始多维字符数组的值填充新的多维字符数组

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 公平地说,他们迭代了 5 次,而不是 15 次:i+=2i++。 ;-)
    • @KonradRudolph 嗯,没错。或者好吧,7次。叹息。
    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2012-03-27
    相关资源
    最近更新 更多