C 字符数组填充
我想声明字符数组,稍后再填充它。但是得到错误:C 字符数组填充,c,file-io,C,File Io,我想声明字符数组,稍后再填充它。但是得到错误: char line[BUFSIZE+1]; strcpy(line,"Memory is Full", sizeof(line)); 错误是: wrong number of arguments in call to strcpy. 是否有其他方法可以实现此目的?strcpy不接受大小/长度参数。改为使用memcpy,但给它指定要复制的字符串的大小(长度+1),而不是缓冲区的大小,否则可能会出现未定义的行为/segfults。strcpy不接
char line[BUFSIZE+1];
strcpy(line,"Memory is Full", sizeof(line));
错误是:
wrong number of arguments in call to strcpy.
是否有其他方法可以实现此目的?strcpy不接受大小/长度参数。改为使用
memcpy
,但给它指定要复制的字符串的大小(长度+1),而不是缓冲区的大小,否则可能会出现未定义的行为/segfults。strcpy
不接受大小/长度参数。改为使用memcpy
,但给它指定要复制的字符串的大小(长度+1),而不是缓冲区的大小,否则可能会出现未定义的行为/segfults。strcpy()
接受2个参数,strncpy()
接受3个参数
我认为您正在考虑使用,这需要目的地、来源和大小
即:
注意:如果完全填充了char[],您必须自己附加'\0'
,否则strncpy()
将为您完成此操作(如我的示例所示)。strcpy()
需要2个参数,strncpy()
需要3个参数
我认为您正在考虑使用,这需要目的地、来源和大小
即:
注意:如果完全填充字符[],则必须自己附加
'\0'
,否则strncpy()
将为您完成此操作(如我的示例所示)。如果您拥有它,请使用strlcpy()
。它执行您可能期望的strncpy()
操作
如果做不到这一点,我建议您使用
snprintf()
,如果您有它。如果您有它,请使用strlcpy()
。它执行您可能期望的strncpy()
操作
如果做不到这一点,我建议您使用
snprintf()
。但是strncpy是一个有问题的、奇怪的函数。我不会建议任何人使用它,memcpy()是一个更安全、更快的函数。@Lundin strncpy有什么问题?@simonc Google的“strncpy问题”、“不要使用strncpy”、“strncpy seg fault”或在本网站上找到任何关于它的争论。昨天有一个..@Mike除了在标准中,其他地方都很清楚:如果s2指向的数组是一个短于n个字符的字符串,则s1指向的数组中的副本将附加空字符,直到总共写入了n个字符。
他们忘记添加:如果s2>=n个字符长的数组,strncpy将导致程序崩溃和烧坏。@simonc:see(实际上是关于strlcpy
,但也讨论了strncpy
),但是strncpy是一个有问题的、奇怪的函数。我不会建议任何人使用它,memcpy()是一个更安全、更快的函数。@Lundin strncpy有什么问题?@simonc Google的“strncpy问题”、“不要使用strncpy”、“strncpy seg fault”或在本网站上找到任何关于它的争论。昨天有一个..@Mike除了在标准中,其他地方都很清楚:如果s2指向的数组是一个短于n个字符的字符串,则s1指向的数组中的副本将附加空字符,直到总共写了n个字符。
他们忘记添加:如果s2>=n个字符长的数组,strncpy将导致程序崩溃和烧毁。@simonc:see(实际上是关于strlcpy
,但也讨论了strncpy
)+1表示snprintf
和strlcpy
,但后者仅在BSD C库(以及Solaris、IIRC或WAST AIX)中可用。+1用于snprintf
和strlcpy
,但后者仅在BSD C库(以及Solaris、IIRC或WAST AIX)中可用。
int main()
{
char i[6];
strncpy(i, "Hello", sizeof(i));
printf("%s\n", i);
return 0;
}
>> ./a.out
>> Hello