【问题标题】:Combine characters from a two dimensional array into a string in C将二维数组中的字符组合成C中的字符串
【发布时间】:2015-12-16 00:59:32
【问题描述】:

我仍然是编程新手,但可以说我有一个二维 char 数组,每个数组中有一个字母。现在我试图将数组中的每个字母组合成一个数组来创建一个单词。

所以grid[2][4]:

  0|1|2|3
0 g|o|o|d
1 o|d|d|s

然后将grid[0][0]grid[0][1]grid[0][2]grid[0][3] 复制到单个数组destination[4] 中,这样它就会显示为“好”。我有类似的东西

char destination[4];
strcpy(destination, grid[0][1]);
for(i=0; i<4; i++)
    strcat(destination, grid[0][i]);

但它只是崩溃..

感谢您朝着正确方向迈出的任何一步。

【问题讨论】:

    标签: c arrays memcpy strcpy


    【解决方案1】:

    strcpy 复制字符串,而不是字符。 C 中的字符串是一系列字符,后跟 \0。这些被称为“空终止”字符串。所以你对strcpystrcat 的调用并没有给他们正确的参数。

    strcpy 一个接一个地复制字符,直到碰到\0;它不只是复制你给它一个指针的一个字符。

    如果你想复制一个字符,可以分配它。

    char destination[5];
    for(i = 0; i < 4; i++)
        destination[i] =  grid[0][i];
    destination[i] = '\0';
    

    【讨论】:

    • 那么我将如何复制一个字符来构建一个字符串?
    • 有人应该向 C 委员会提议chrcpy 来填补这个急需的空白。毕竟,我们有strchrstrstr
    【解决方案2】:

    在 C 中,运行时库函数 strcpystrcat 需要以零结尾的字符串。你交给他们的不是零终止的,所以这些函数会因为它们依赖于终止零来指示它们何时应该停止而崩溃。它们在 RAM 中运行,直到读取到零,这可能在 RAM 中的任何位置,包括程序外部受保护的 RAM,从而导致崩溃。在现代工作中,我们认为像 strcpy 和 strcat 这样的函数是不安全的。给他们指针的任何错误都会导致这个问题。

    存在多个版本的 strcpy 和 strcat,名称略有不同,它们需要一个整数或 size_t 来指示它们的最大有效大小。例如strncat 有签名:

    char * strncat( char *destination, const char *source, size_t num );
    

    如果在你的情况下,你使用了 strncat,为最后一个参数提供 4,它就不会崩溃。

    但是,您可能更愿意探索另一种选择。您可以简单地使用索引,如下所示:

    char destination[5]; // I like room for a zero terminator here
    
    for(i=0; i<4; i++)
        destination[i] = grid[0][i];
    

    这不处理零终止符,您可能会附加:

    destination[4] = 0;
    

    现在,假设您想继续,将两个单词放入一个输出字符串中。你可以这样做:

    char destination[10]; // I like room for a zero terminator here
    
    int d=0;
    for(r=0; r<2; ++r ) // I prefer the habit of prefix instead of postfix    
     {
      for( i=0; i<4; ++i ) 
         destination[d++] = grid[r][i];
    
      destination[d++] = ' ';// append a space between words
     }
    

    在对可能更大的目的地声明进行任何处理之后,添加一个零终止符

    destination[ d ] = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多