在C中的strcpy()之前,如何初始化char数组并在循环中一次又一次地清空它?
我想在循环中每次都重新初始化d在C中的strcpy()之前,如何初始化char数组并在循环中一次又一次地清空它?,c,loops,initialization,char,C,Loops,Initialization,Char,我想在循环中每次都重新初始化d char d[90]; while(ptr != NULL) { printf("Word: %s\n",ptr); //int k = 0; strcpy(d, ptr); d[sizeof(d)-1] = '\0'; //something more .... .... } 没有必要在strcpy()之前
char d[90];
while(ptr != NULL)
{
printf("Word: %s\n",ptr);
//int k = 0;
strcpy(d, ptr);
d[sizeof(d)-1] = '\0';
//something more
....
....
}
没有必要在strcpy()之前做任何事情。在缓冲区
d
上调用strcpy()
将覆盖缓冲区中的任何内容,并使缓冲区保留调用时由ptr
指向的字符串。不需要将最后一个字符指定给“\0”
当然,如果您正在执行显式终止,因为您不确定
strcpy()
是否会覆盖d
,那么您就有问题了。在复制之前,您应该在ptr
上使用strlen()
,以确保它合适,或者如果您有,可以使用snprintf()
。无需在strcpy()之前执行任何操作。在缓冲区d
上调用strcpy()
将覆盖缓冲区中的任何内容,并使缓冲区保留调用时由ptr
指向的字符串。不需要将最后一个字符指定给“\0”
当然,如果您正在执行显式终止,因为您不确定strcpy()
是否会覆盖d
,那么您就有问题了。在复制之前,您应该在ptr
上使用strlen()
,以确保它合适,或者如果您有,可以使用snprintf()
。memset(d,0,90)?memset(d,0,90)?展开操作完全正确。在strcpy()之前不需要做任何事情。但是,如果您发现自己以后需要将某些内存初始化为特定模式,则可以使用以下方法:
void* pointerToMemory; // Initialize this appropriately
unsigned char initValue = 0; // Or whatever 8-bit value you want
size_t numBytesToInitialize; // Set this appropriately
memset(pointerToMemory, initValue, numBytesToInitialize);
放松是完全正确的。在strcpy()之前不需要做任何事情。但是,如果您发现自己以后需要将某些内存初始化为特定模式,则可以使用以下方法:
void* pointerToMemory; // Initialize this appropriately
unsigned char initValue = 0; // Or whatever 8-bit value you want
size_t numBytesToInitialize; // Set this appropriately
memset(pointerToMemory, initValue, numBytesToInitialize);
只需执行strcpy(d,ptr)
strcpy
将在末尾为您添加空终止符,当然前提是d
可以容纳至少与ptr
一样多的字符,只需执行strcpy(d,ptr)
strcpy
将在末尾为您添加空终止符,当然假设d
至少可以容纳与ptr
相同数量的字符,然后执行此操作。。。是什么阻止了你?有什么理由不能在while循环中声明d变量吗?@coelhudo yes“SCOPE”。我想这会导致重新声明错误。正如stackoverflowers在你的另一个线程中对你说的,你应该使用strncpy而不是strcpy,以避免复制一个更大的字符串ptr,因为dFriends不允许朋友使用strncpy。如果您想自己检查缓冲区长度,请使用strcpy。如果没有,请使用(或滚动您自己的)strcpy_,这样您就不必手动nul终止。stncpy的唯一优点是它是标准的,它所做的只是用读时的缓冲区溢出替换写时的缓冲区溢出。。。是什么阻止了你?有什么理由不能在while循环中声明d变量吗?@coelhudo yes“SCOPE”。我想这会导致重新声明错误。正如stackoverflowers在你的另一个线程中对你说的,你应该使用strncpy而不是strcpy,以避免复制一个更大的字符串ptr,因为dFriends不允许朋友使用strncpy。如果您想自己检查缓冲区长度,请使用strcpy。如果没有,请使用(或滚动您自己的)strcpy_,这样您就不必手动nul终止。stncpy的唯一优点是它是标准的,它所做的只是用读时的缓冲区溢出替换写时的缓冲区溢出。@Alex:很高兴它有帮助。。。如果你满意的话,请随意接受答案。strncpy是strcpy的安全版本,而不是snprintf@Pete:我不同意。SrncPy()的语义非常奇怪,我认为最好避免。它有两个主要错误:如果输入大于缓冲区,它不会终止输出字符串;如果输入小于缓冲区,它会将输出填充到其最大大小。很少有你想要的。@Alex:很高兴它帮了你。。。如果你满意的话,请随意接受答案。strncpy是strcpy的安全版本,而不是snprintf@Pete:我不同意。SrncPy()的语义非常奇怪,我认为最好避免。它有两个主要错误:如果输入大于缓冲区,它不会终止输出字符串;如果输入小于缓冲区,它会将输出填充到其最大大小。很少有你想要的。