在C中的strcpy()之前,如何初始化char数组并在循环中一次又一次地清空它?

在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()之前

我想在循环中每次都重新初始化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()之前做任何事情。在缓冲区
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()的语义非常奇怪,我认为最好避免。它有两个主要错误:如果输入大于缓冲区,它不会终止输出字符串;如果输入小于缓冲区,它会将输出填充到其最大大小。很少有你想要的。