如何预防" str \ 0ing"从C中的复制功能中转义?

时间:2017-10-06 17:04:37

标签: c string escaping terminator

我们说我有:

 char a[] = "str\0ing"  

我希望将此字符串复制到另一个字符数组

char b[]. 

然而,我的函数似乎是触及终结符序列(或者至少是正斜杠)并停止,这样复制到b []的唯一东西就是" str"。到底发生了什么,我怎么能绕过这个?

我正在使用格式为b [i] == a [i]的简单For循环。感谢。

编辑:我为非常不清楚而道歉,这是我在这里的第一篇文章。 这是我目前的代码:

int copyStringN(char * in, char * out, int n) {
  int i;
  if (!in || !out) return -1;
  for (i = 0; i < n; i++) {
    *out++ = *in++;
  }
  *out= '\0';
  return 0;
}

int main() {
#define N 8
  char a[] = "th\0ing";
  char b[N];
  int err;
  err = copyStringN(a, b, N);
  assert (!err);
  printf("%s\n", b);
  return 0;
}

限制是它必须能够打印&#34; \ 0&#34;如果它存在,所以我不能简单地在字符串中添加另一个反斜杠。我必须以某种方式编写我的函数来将此字符序列解释为显式字符而不是终结符。

3 个答案:

答案 0 :(得分:2)

如果您希望将\0视为NUL字符(\0)本身,而不是\0,则可以使用{ {1}}喜欢

memcpy()

这会将char b[sizeof(a)]; memcpy(b, a, sizeof(a)); 的{​​{1}}字节复制到sizeof(a)

了解a here

正如John指出的那样,如果您将b作为参数传递给

这样的函数,那么这项工作将无法奏效
memcpy()

因为a只给出一个指针变量的大小,它对所有指针都是相同的,而不管void fn(char b[], char a[]); ... ... fn(b, a); 的大小。这是因为在将数组传递给函数时,数组的地址是传递的,函数中的sizeof(a)实际上是指针。

即使功能类似

,也是这样
a

甚至

a

因此,如果您将int fn(char b[], char *a); 传递给函数,请确保将其大小传递给

int fn(char b[], char a[10]);

答案 1 :(得分:0)

要获得看起来的输出,例如“str \ 0ing”,请使用额外的\转义NULL字符:

int main(void) 
{
    char a[] = "str\\0ing";
    int len = strlen(a);
    char b[len+1];
    for(int i=0;i<len+1;i++)
    {
        b[i] = a[i];
    }
    printf("%s\n", b);

    return 0;
}

输出:
enter image description here

答案 2 :(得分:0)

这是通过简单的for循环来实现的:

formula

当然还有其他方法,但是你说你使用了for循环,所以这可能与你已经尝试过的最接近。

这里的想法是#include <assert.h> #include <stdio.h> int main() { char a[] = "str\0ing"; int length = sizeof a / sizeof(char); char b[length]; for (int i = 0; i < length; i++) { b[i] = a[i]; } assert(b[0] == 's'); assert(b[1] == 't'); assert(b[2] == 'r'); assert(b[3] == '\0'); assert(b[4] == 'i'); assert(b[5] == 'n'); assert(b[6] == 'g'); printf("It works\n"); } 不是字符串。这是一个字符数组。 C中的字符串是以零字节终止的字节序列。如果要在字符串中包含零字节,则它不是字符串。这是一个字符数组。因此,上面的代码会将数组a中的字符复制到数组a

请注意为b分配足够空间的重要性。

修改

好的,现在您已经添加了问题,我们可以看到您确实知道如何复制。但是你的问题是你希望b显示一个包含零字节的字符串。它不会。如果你只是给它指向字符串开头的指针,那就没有了。

如果要打印带有零字节的“字符串”,唯一的方法是将字符数据及其长度包装到对象中,然后使用特殊打印功能打印它。

或者,如果可以,只需转移到C ++,它完全没有问题:

printf

它运行得很好:

#include <iostream>
int main() {
  std::string s("str\0ing", 7);
  std::cout << s << '\n';
}

多田!