C 如何使用指针清除字符数组?

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

我有一个指向字符数组的字符指针。 我想清除字符数组,然后字符串复制其中的其他数组。memset对字符指针不起作用。 还有别的办法吗

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
进行编译。您是对的@BLUEPIXY
memset(&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结尾的字符串