【发布时间】:2020-07-28 14:39:14
【问题描述】:
我是 C 初学者,我在 Windows 上使用 CodeBlocks。
我了解到字符串是一个字符序列(字符),但我需要一个字符串序列。
在一个视频中,我看到如果我在字符串中使用指针(它是 char string[20][10],现在是 char* string[20][10]),我可以将字符串的每个“空格”打印为字符串而不是 @987654324 @。 (我的意思是空格,例如,string[0][0])。但是后来我尝试在该字符串的两个空格中使用strcpy(),但程序没有工作。谁能告诉我为什么会发生这种情况以及指针在这种字符串中发生了什么变化?
编辑:这是无效的代码:
#include <stdio.h>
#include <string.h>
int main()
{
int i, j;
char* array[3][10];
for(i = 0; i != 3; i++)
{
for(j = 0; j != 10; j++)
{
if(i == 0)
{
array[i][j] = "ABC";
}
else if(i == 1)
{
array[i][j] = "DEF";
}
else if(i == 2)
{
array[i][j] = "GHI";
}
}
}
for(i = 0; i != 3; i++)
{
for(j = 0; j != 10; j++)
{
printf("%s", array[i][j]);
}
printf("\n");
}
strcpy(array[2][0], array[1][0]);
return 0;
}
(这不是实际代码,我有一个问题在这里很难解释。但是如果您在阅读此代码后仍然觉得这个问题令人困惑,我将尝试解释原始问题)。
【问题讨论】:
-
你能提供一个minimal reproducible example吗?
-
请提供“无效”的代码。
-
char* string[20][10]是char *的二维数组,在这种情况下,string[0][0]将保存char *类型的值。如果这样的值用作strcpy的第二个参数,则它需要指向空终止字符串的第一个元素。如果它被用作strcpy的第一个参数,它需要指向一个足够大的缓冲区来保存第二个参数指向的空终止字符串。如果两者都不是,这将解释为什么它“不起作用”。 -
@IanAbbott 我在 strcpy 的两个参数中都使用了 char* 类型的两个值。究竟什么是空终止字符串?
-
@KazzioBots 以空结尾的字符串是
char的数组(或像char的数组一样组织的内存块),其中一个零值的char元素标记了细绳。空终止字符串的“长度”(strlen返回的是空终止符之前的chars 的数量。当使用strcpy将空终止的源字符串复制到目标缓冲区时,目标缓冲区需要大到足以容纳整个字符串直到并包括空终止符(至少1+strlen(srcstring)chars 长)。
标签: c string windows codeblocks string.h