【问题标题】:How to clear char array using pointer?如何使用指针清除字符数组?
【发布时间】:2017-09-10 03:16:00
【问题描述】:

我有一个指向字符数组的字符指针。 我想清除字符数组,然后在其中复制一些其他数组。memset 不适用于 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
提前致谢。

【问题讨论】:

  • memset(&text, 0 , sizeof(*text));--> memset(text, 0 , strlen(text)); 但在这种情况下memset 是不必要的。
  • 也没用!
  • @Savan BLUEPIXY 的评论是正确的。如果它对您不起作用,那么您需要发布minimal, complete, and verifiable example,因为您的代码无法编译。要获取有关代码问题的更多信息,请在 gcc 或 clang 上使用 -Wall 进行编译。
  • 你是对的@BLUEPIXY

标签: c arrays pointers character


【解决方案1】:

sizeof(*text) 将始终为 1(与 sizeof(char) 相同)。但是,如果您打算仅将字符串的第一个字节设为空,就足够了。

memset的第一个参数是指向内存块开始的指针,而text已经是一个指针,所以memset(text, 0 , strlen(text));是正确的(没有&

但是,memset 毫无意义,因为下面的 strcopy 无论如何都会覆盖它。

【讨论】:

    【解决方案2】:

    您可以像这样更改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()也复制了空字符,所以不需要再做。

    【讨论】:

    • 您的第一个 sn-p 实际上会导致未定义的行为。原始指针a 指向 char[100],你将它的 120 个字节设置为 0。
    • @TomášZahradníček 不,因为我使用的是strlen(res),它实际上逐个字节地遍历res 字符串,并在第一个空字节出现时停止,就在"stackisjustgreat 字符串之后(如果我计数正确,第 17 个字节将为 NULL)。如果我使用sizeof(res) 而不是strlen(res),就会出现您指出的问题。
    • 我是正确的,没有意识到你使用了strlen 将参数视为空终止字符串
    【解决方案3】:

    在 memset 的行上,参数 1 应该只是文本,文本已经是一个指针。放置 &text 将放置一个指向该指针的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多