我还是编程新手,但我想说我有一个二维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]);
但它只是崩溃..
赞赏正确方向的任何一步。
答案 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
。这些被称为“空终止”字符串。因此,您拨打strcpy
和strcat
的电话并未向他们提供正确的参数。
strcpy
将字符复制到字符后直到达到\0
;它不只是复制你给它指向的一个字符。
如果你想复制一个角色,可以直接分配它。
char destination[5];
for(i = 0; i < 4; i++)
destination[i] = grid[0][i];
destination[i] = '\0';