-2

假设我有:

 char a[] = "str\0ing"  

我想将此字符串复制到另一个字符数组中,

char b[]. 

但是,我的函数似乎正在击中终止符序列(或至少是正斜杠)并停止,因此复制到 b[] 中的唯一内容是“str”。这里到底发生了什么,我该如何解决这个问题?

我正在运行一个简单的 For 循环,格式为 b[i] == a[i]。谢谢。

编辑:我很抱歉不清楚,这是我在这里的第一篇文章。这是我当前的代码:

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;
}

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

4

3 回答 3

2

如果您希望\0将 视为NUL字符 ( \0) 本身而不是\and 0,您可以使用memcpy()like

char b[sizeof(a)];
memcpy(b, a, sizeof(a));

这将复制tosizeof(a)的字节。ab

memcpy() 在这里阅读。

正如约翰指出的那样,如果您已将a其作为参数传递给类似的函数,这将不起作用

void fn(char b[], char a[]);
...
...
fn(b, a);

assizeof(a)将给出一个指针变量的大小,它对于所有指针都是相同的,而不管a. 这是因为将数组传递给函数时,数组的地址是a传递的a,而函数中的实际上是一个指针。

即使功能是这样的

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

甚至

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

所以如果你传递a给一个函数,一定要传递它的大小,就像

void fn(char b[], char a[], size_t len)
{
    memcpy(b, a, len);
}
...
...
...
size_t l=sizeof(a);
fn(a, l);
于 2017-10-06T17:19:51.587 回答
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;
}

输出:
在此处输入图像描述

于 2017-10-06T17:15:31.740 回答
0

这就是你如何使用一个简单的 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");
}

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

这里的想法是这a不是一个字符串。它是一个字符数组。C 中的字符串是以零字节结尾的字节序列。如果你想在你的字符串中有一个零字节,它不是一个字符串。它是一个字符数组。所以上面的代码将字符从数组复制a到数组b

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

编辑

好的,既然您添加了您的问题,我们可以看到您确实知道如何复制。但是您的问题是您希望printf显示一个包含零字节的字符串。它不会。如果您只是将指针指向字符串的开头,则不会。

如果要打印其中包含零字节的“字符串”,唯一的方法是将字符数据及其长度包装到一个对象中,并使用特殊的打印功能进行打印。

或者,如果可以的话,直接转向 C++,这完全没有问题:

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

它运行得很好:

$ g++ t.cpp && ./a.out
string

多田!

于 2017-10-06T17:16:37.227 回答