将二维数组中的字符组合成C中的字符串

时间:2015-09-18 19:13:04

标签: c arrays memcpy strcpy

我还是编程新手,但我想说我有一个二维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]);

但它只是崩溃..

赞赏正确方向的任何一步。

2 个答案:

答案 0 :(得分:3)

在C中,运行时库函数@app.task(name="test_exception",error_whitelist=[]) strcpy需要零终止字符串。你交给他们的东西不是零终止,因此这些函数会因为它们依赖于终止零而崩溃,以指示它们何时应该停止。它们通过RAM运行,直到它们读取零,这可能是RAM中的任何位置,包括程序外的受保护的RAM,导致崩溃。在现代工作中,我们认为strcpy和strcat之类的函数是不安全的。处理指针时出现任何错误都会导致这个问题。

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

strncat

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

但是,您可能更喜欢探索另一种选择。您可以简单地使用索引,如:

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

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

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
 }

答案 1 :(得分:2)

strcpy复制字符串,而不是字符。 C中的字符串是一系列字符,后跟\0。这些被称为“空终止”字符串。因此,您拨打strcpystrcat的电话并未向他们提供正确的参数。

strcpy将字符复制到字符后直到达到\0;它不只是复制你给它指向的一个字符。

如果你想复制一个角色,可以直接分配它。

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