【问题标题】:How can I overwrite an array of chars (AKA a string), with a new array of chars in C?如何用 C 中的新字符数组覆盖字符数组(也称为字符串)?
【发布时间】:2011-04-20 20:44:55
【问题描述】:
int main(void) {
  ...
  char A[32] = "00000000000000001111111111111110"; 
  ...
  A = "11111111111111111111111111111111";
}

这是我想做的错误的 c 代码。我希望用相同长度的新字符串覆盖内存中的字符串。我不断收到类似类型不兼容的错误。

【问题讨论】:

  • 您对A 的声明可能差了一个。
  • @mu 太短:问题中的代码是合法的 C,它是 32 个char 的数组,用给定的 32 个字符初始化。不需要在A 中包含 NUL 终止符,除非您想将其视为以 NUL 终止的字符串。编译器知道 NUL 终止符不适合,并且在从常量字符串执行 A 的初始化时不会复制它。
  • @Greg:因此是 probably 资格。它看起来像一个字符串,闻起来像一个字符串,我们不知道它是一个字符串还是一个字符数组。初始化使它看起来像一个字符串,所以我至少在代码审查中将其标记为模棱两可。我们不知道A 是如何使用的,所以我们不知道它是否是一个错误,我们只知道它看起来很可疑。答案中出现strcpystrncpy 表明它是模棱两可的,memcpy 表明有些人注意到了模棱两可并试图解释它。
  • 你说得对,使用 probably 是正确的选择。 :)
  • 从技术上讲,strncpy 并非用于处理以空结尾的字符串,而是用于处理空 填充 字符串。只是后者即使在固定大小的结构成员中也很少见。

标签: c arrays char incompatibletypeerror


【解决方案1】:

使用strncpy:

char chararray[6];
(void)strncpy(chararray, "abcdefgh", sizeof(chararray));

【讨论】:

    【解决方案2】:
    memcpy(A,"11111111111111111111111111111111",32);
    

    【讨论】:

      【解决方案3】:

      使用strcpy(char *destination, const char *source);

      #include <string.h>
      
      int main(void) {
        ...
        char A[32] = "00000000000000001111111111111110"; 
        ...
        strcpy(A, "11111111111111111111111111111111");
      }
      

      虽然更安全的是strncpy(char *destination, const char *source, size_t num),它只会复制num数量的字符,防止超出目的地范围:

      #include <string.h>
      
      int main(void) {
        ...
        char A[32] = "00000000000000001111111111111110"; 
        ...
        strncpy(A, "11111111111111111111111111111111", sizeof(A));
      }
      

      【讨论】:

        【解决方案4】:

        在其他可能的方式中,您可以这样做

        memcpy(A, "11111 etc.", 32);
        

        你至少想把 32 变成一个命名常量。您还必须小心缓冲区溢出;在 C 中,这没有被检查。

        【讨论】:

          【解决方案5】:

          查看库函数strcpy

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-20
            • 1970-01-01
            • 1970-01-01
            • 2016-11-20
            相关资源
            最近更新 更多