【问题标题】:C - Copy char array that contains '\0' to another char array, eliminating '\0'C - 将包含 '\0' 的 char 数组复制到另一个 char 数组,消除 '\0'
【发布时间】:2017-04-28 12:10:24
【问题描述】:

是否有任何 C 库函数可以将 char 数组(包含一些 '\0' 字符)复制到另一个 char 数组,而不复制 '\0'
例如,"he\0ll\0o" 应复制为 "hello"

【问题讨论】:

  • 你能发布一些你的代码吗?您是否定义了这些字符串,因为如果您这样做,在字符串中间包含字符串终止符肯定是不好的设计。这表明您并不真正了解字符串或准确地说是char 数组在 C 中的工作原理。
  • 并不是我想在里面包含字符串终止符,但我必须这样做,我被要求这样做,虽然这是一个糟糕的设计。
  • 你知道char数组有多长吗?
  • @Neil 是的,我知道尺寸。

标签: c null char-pointer


【解决方案1】:

只要你知道 char 数组有多长,那么:

void Copy(const char *input, size_t input_length, char *output)
{
  while(input_length--)
  { 
     if(input!='\0')
        *output++ = input;
     input++;
   }
   *output = '\0'; /* optional null terminator if this is really a string */
}

void test()
{
     char output[100];
     char input = "He\0ll\0o";
     Copy(input, sizeof(input), output);
 }

【讨论】:

  • 别忘了在最后添加一个空字节。
  • @dbush 我想过,但我不认为这些是真正的字符串,它们是已知大小的内存块。
【解决方案2】:

不,没有库函数可以做到这一点。你必须自己写。

有一个问题:你怎么知道什么时候停止忽略\0?您的字符串 ("he\0ll\0o") 有三个零字节。你怎么知道停在第三个?

【讨论】:

    【解决方案3】:

    '\0' in strings 是一种查找字符串结尾的方法(字符串的终止字符)。因此,所有为字符串操作设计的函数都使用'\0'来检测字符串的结尾。

    现在,如果您想要按照您的要求进行实施,您需要自己设计。
    您将面临的问题是:
    1) 你将如何确定哪个 '\0' 用作终止字符?
    因此,对于此类实现,您需要明确告知用作终止字符的 '\0' 的计数,或者您需要为字符串设置自己的终止字符。
    2) 对于您的实现中的任何其他操作,您不能使用预定义的字符串相关函数。
    因此,实现您自己的功能来执行这些操作。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多