C 如何使用指针清除字符数组?
我有一个指向字符数组的字符指针。 我想清除字符数组,然后字符串复制其中的其他数组。memset对字符指针不起作用。 还有别的办法吗C 如何使用指针清除字符数组?,c,arrays,pointers,character,C,Arrays,Pointers,Character,我有一个指向字符数组的字符指针。 我想清除字符数组,然后字符串复制其中的其他数组。memset对字符指针不起作用。 还有别的办法吗 int main(){ char a[100] = "coepismycollege"; char *p; p = a; test(p); printf("After function : %s", a); } void test(char *text){ char
int main(){
char a[100] = "coepismycollege";
char *p;
p = a;
test(p);
printf("After function : %s", a);
}
void test(char *text){
char res[120] = "stackisjustgreat";
printf("text = %s\nres = %s\n", text , res);
memset(&text, 0 , sizeof(*text));
strcpy(text, res);
}
输出应该是:stackisjustgreat
提前感谢。
sizeof(*text)
将始终为1(与sizeof(char)
相同)。但是,如果您只想将字符串的第一个字节设为null,那么这就足够了
memset
的第一个参数是指向内存块开头的指针,text
已经是一个指针,所以memset(text,0,strlen(text))代码>正确(没有和)
但是,memset
是没有意义的,因为下面的strcopy无论如何都会覆盖它。sizeof(*text)
将始终为1(与sizeof(char)
相同)。但是,如果您只想将字符串的第一个字节设为null,那么这就足够了
memset
的第一个参数是指向内存块开头的指针,text
已经是一个指针,所以memset(text,0,strlen(text))代码>正确(没有和)
但是,memset
是没有意义的,因为下面的strcopy无论如何都会覆盖它。在带有memset的行上,参数1应该只是文本,文本已经是指针。放置&text将放置指向该指针的指针。在带有memset的行上,参数1应该只是文本,文本已经是指针。放置&text将放置指向该指针的指针。您可以更改test()
函数,如下所示:
void test(char* text) {
char res[120] = "stackisjustgreat";
const size_t len = strlen(res); // NOT sizeof(res)
memset(text, 0, len); // This is actually not necesary!
strncpy(text, res, len); // text will already be properly null-terminated
}
更简短的版本可能是:
void test(char* test) {
char res[120] = "stackisjustgreat";
strcpy(test, res, strlen(res));
}
只需通过strlen(res)
找出res
指向的字符串长度,然后使用str(n)cpy()
复制字符串。由于str(n)cpy()
也复制空字符,因此无需执行更多操作。您可以更改test()
函数,如下所示:
void test(char* text) {
char res[120] = "stackisjustgreat";
const size_t len = strlen(res); // NOT sizeof(res)
memset(text, 0, len); // This is actually not necesary!
strncpy(text, res, len); // text will already be properly null-terminated
}
更简短的版本可能是:
void test(char* test) {
char res[120] = "stackisjustgreat";
strcpy(test, res, strlen(res));
}
只需通过strlen(res)
找出res
指向的字符串长度,然后使用str(n)cpy()
复制字符串。由于str(n)cpy()
也复制空字符,因此无需执行更多操作。memset(&text,0,sizeof(*text))代码>-->memset(文本,0,strlen(文本))代码>但在这种情况下,不需要memset
。也没有帮助@萨万·布鲁皮西的评论是正确的。如果它对您不起作用,那么您需要发布一篇文章,因为您的代码无法编译。要获得有关代码错误的更多信息,请在gcc或clang上使用-Wall
进行编译。您是对的@BLUEPIXYmemset(&text,0,sizeof(*text))代码>-->memset(文本,0,strlen(文本))代码>但在这种情况下,不需要memset
。也没有帮助@萨万·布鲁皮西的评论是正确的。如果它对您不起作用,那么您需要发布一篇文章,因为您的代码无法编译。若要了解有关代码错误的更多信息,请在gcc或clang上使用-Wall
进行编译。您是对的@bluepixy您的第一个代码片段实际上会导致未定义的行为。原始指针a
指向char[100],您正在将其中120个字节设置为0。@Tomášzahradnickek否,因为我使用的是strlen(res)
,它实际上一个字节接一个字节地遍历res
字符串,并在第一个空字节出现时停止,这就在stackisjustgreat
字符串之后(如果我正确计数,第17个字节将为空)。如果我使用sizeof(res)
而不是strlen(res),则会出现您指出的问题
。我被纠正了,没有意识到您使用的strlen
将参数视为以null结尾的字符串。您的第一个代码片段实际上会导致未定义的行为。原始指针a
指向char[100],您将其120字节设置为0。@TomášZahradníček否,因为我使用的是strlen(res)
,它实际上一个字节接一个字节地通过res
字符串,并在第一个空字节出现时停止,这就在stackisjustgreat
字符串之后(如果我正确计数,第17个字节将为空)。如果我使用sizeof(res)
而不是strlen(res),您指出的问题就会出现
。我被纠正了,不知道您使用了strlen
,它将参数视为以null结尾的字符串