【问题标题】:using C copy a 1D char array into 2D char array使用 C 将一维字符数组复制到二维字符数组中
【发布时间】:2022-06-16 22:53:45
【问题描述】:

我正在尝试将一维字符串数组复制到 C 中的二维字符串数组中。

我能够用整数实现这一点 enter image description here

//Here is what I tried for integers.
        int main() 
    { 
        int arr[3][3];
        int arr2[9]={1,2,3,4,5,6,7,8,9}; 
    
        int i,j,k=0; 
    
        for(i=0; i<3;i++){
            for(j=0; j<3;i++){
              arr[j][i] = arr2[i];
                //rintf(\"%d\\n\",arr2[i]);
            }
            
        }
    
     for(i=0; i<3; i++) { 
        for(j=0; j<3; j++) 
          printf(\"%2d  \", arr[j][i]); 
        printf(\"\\n\"); 
      } 
    
        return 0; 
    } 

我将数据更改为 char 并尝试运行相同的代码,但出现分段错误。 这是我迄今为止尝试过的,但没有奏效。错误:分段错误(核心转储)

 #include<stdio.h> 
#include<string.h> 
 
int main() 
{ 
    char *d[3][3];  // Destination array 

    char *s[9]={\"orange\",\"apple\",\"table\",\"chair\",\"cable\",\"TV\", \"124\",\"HI\"};   // Source 1 Day array

    int i,j,k=0; 

    for(i=0; i<3;i++){
        for(j=0; j<3;i++){
            
          strcpy(d[j][i], s[i]);
           
        }
            }

 for(i=0; i<3; i++) { 
    for(j=0; j<3; j++) 
      printf(\"%s  \", d[j][i]); 
    printf(\"\\n\"); 
  } 

    return 0; 
} 

我做了一些调整,现在它打印了一些奇怪的字符串

#include<stdio.h> 
#include<string.h> 
 
int main() { 

    char d[3][3] ={0};  // Destination array 

    char s[9][8]={\"orange\",\"apple\",\"table\",\"chair\",\"cable\",\"TV\", \"124\",\"HI\"};   // Source 1 Day array

    int i,j,k=0; 
    
    for(i=0; i<3;i++){
        for(j=0; j<3;j++){

            d[j][i] = *s[i];
           
        }
            }
    
    for(i=0; i<3; i++) { 
        for(j=0; j<3; j++) 
            printf(\"%s  \", &d[j][i]); 
            printf(\"\\n\"); 
    } 

    return 0; 
} 

enter image description here

  • for(j=0; j&lt;3;i++){ 行中,我相信i++ 应该是j++。否则,循环将永远不会结束。
  • 在您的第一个代码中,arr[j][i] = arr2[i] 应该类似于 arr[j][i] = arr2[i*3+j]
  • 在您的第二个代码中,您没有为s 中的char* 元素分配空间。
  • 您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值,以确定您的程序在哪一行停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?
  • 请删除输入和输出的图像并复制粘贴实际文本。

标签: arrays c gcc multidimensional-array c-strings


【解决方案1】:

这个for循环

    for(i=0; i<3;i++){
        for(j=0; j<3;i++){
          arr[j][i] = arr2[i];
            //rintf("%d\n",arr2[i]);
        }
        
    }

是不正确的。在内部循环中,使用了相同的元素arr2[i],其中i0 更改为2,包括在内。

你需要写

    for(i=0; i<3;i++){
        for(j=0; j<3;i++){
          arr[j][i] = arr2[ 3 * i + j];
        }
    }

另一种编写循环的方法如下

    for ( i = 0; i < 9; i++ )
    {
        arr[i / 3][i % 3] = arr2[i];
    }

至于 char * 类型的指针数组,则嵌套循环看起来相似

for(i=0; i<3;i++){
    for(j=0; j<3;i++){
        
      d[i][j] = s[ 3 * i + j];
       
    }
}

假设数组 s 声明为

char * s[9]={"orange","apple","table","chair","cable","TV", "124","HI"};   

并输出您需要编写的结果数组

 for(i=0; i<3; i++) { 
    for(j=0; j<3; j++) 
      printf("%s  ", d[i][i]);
                     ^^^^^^^ 
    printf("\n"); 
  } 

至于你的最后一个程序,它看起来像

#include<stdio.h> 
#include<string.h> 
 
int main( void ) 
{ 

    char d[3][3][8] ={0};  // Destination array 

    char s[9][8]={"orange","apple","table","chair","cable","TV", "124","HI"};   // Source 1 Day array

    for( size_t i = 0; i < 3; i++ )
    {
        for ( size_t j = 0; j < 3;j++ )
        {
            strcpy( d[j][i], s[3 * i + j] );
           
        }
    }
    
    for ( size_t i = 0; i < 3; i++ ) 
    { 
        for ( size_t j = 0; j < 3; j++ )
        { 
            printf( "%s  ", d[i][j] ); 
        }
        putchar( '\n' ); 
    } 

    return 0; 
} 

【讨论】:

  • 非常感谢,我能够像我想要的那样打印行和列。谢谢
  • @Moodkiller 一点也不。我们,初学者,应该互相帮助。:)
  • 我还可以通过更改 d[j][i] = s[ 3 * j+i]; 来打印它因为我希望它按列打印并排序。橙色椅子 124 苹果电缆 HI 表电视 再次感谢您。
【解决方案2】:

一些问题...

  1. d 未初始化,因此指针内点到随机位置。

  2. 要修复,我们需要使用malloc 来获取空间,然后使用strcpy。更简单的方法是使用strdup。或者,直接分配s 值。

  3. 你的 j 循环应该增加 j不是i

  4. 使用s[i] 将在三个元素之后重复。要修复,我们可以这样做:s[k++]

  5. 你是 s 的一个初始化器(即长度为 9,但你只有 8 个字符串)。


    这是重构后的代码:

    #include <stdio.h>
    #include <string.h>
    
    int
    main(void)
    {
        char *d[3][3];                      // Destination array
    
        char *s[9] = {
            "orange", "apple", "table", "chair", "cable", "TV", "124", "HI",
    #if 1
            "raindrops"
    #endif
        };  // Source 1 Day array
    
        int i, j, k = 0;
    
        for (i = 0; i < 3; i++) {
            for (j = 0; j < 3; j++) {
    // NOTE/BUG: we must allocate space for d[j][i]
    #if 0
                strcpy(d[j][i], s[i]);
    #else
                d[j][i] = strdup(s[k++]);
    #endif
            }
        }
    
        for (i = 0; i < 3; i++) {
            for (j = 0; j < 3; j++)
                printf("%s  ", d[j][i]);
            printf("\n");
        }
    
        return 0;
    }
    

    这是输出:

    orange  apple  table
    chair  cable  TV
    124  HI  raindrops
    

【讨论】:

【解决方案3】:

这里有很多大问题。

  • 你可以用memcpy(arr, arr2, sizeof *arr2);简单地解决这个问题

  • (可能是你的问题中最少的,但是......)这在性能方面写得不好:for(j=0; j&lt;3;i++){ arr[j][i] = arr2[i]; 多个循环应该总是让最内层的循环与最内层的数组项一起工作,在这种情况下它应该是arr[i][j],否则您将获得不必要的糟糕数据缓存性能。

  • for(j=0; j&lt;3;i++)j++ 怎么样。

  • char *d[3][3]; 是一个未初始化的二维数组指针, 每个都指向 la-la-land。因此,您不能将 jack 复制到这些地址中 - 指针需要指向有效的已分配内存。

  • char d[3][3] 是一个 3x3 字符的二维数组,因此它不能包含您希望存储在那里的数据,更不用说字符串工作所需的强制空终止符了。

  • char *s[9] = ... 如果您的意思是第 9 项为 NULL,即所谓的哨兵值,您应该明确输入 NULL,否则读者无法判断 NULL 哨兵是有意的还是您只是草率不小心加了一个。

  • 从以前的 cmets 可以看出,整体的倾斜是这里反复出现的主要问题。举个例子:

      for(j=0; j<3; j++) 
          printf("%s  ", &d[j][i]); 
          printf("\n"); 
    

    由于缩进草率,我们无法判断printf("\n"); 是否打算位于内部循环内(它不是,尽管有缩进)。你不能只是匆忙输入一些几乎正确的东西。您必须仔细输入实际正确的代码。有各种各样的神话说伟大的程序员很聪明,擅长数学或抽象思维等等——实际上,伟大的程序员是谨慎而有纪律,对自己的手艺感到自豪。

快速而肮脏的解决方法是使用第二个示例char* d[3][3],然后使用strdup 代替strcpy(当前非标准,即将成为标准):

for(size_t i=0; i<3; i++){
  for(size_t j=0; j<3; j++){
    d[i][j] = strdup(s[i]);
  }
}

(理想情况下,最后还为d 中的每个项目调用free()。)

但这里的根本问题是,在使用它们之前,您需要按顺序仔细研究数组、指针和字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多