将字符串复制到另一个没有\ 0的字符串

时间:2016-07-28 15:24:53

标签: c arrays string fgets null-terminated

我必须在不使用\ 0的情况下将字符串放入另一个字符串中,我尝试了很多方法,但字符串总是很脏。

char string[100];
int pos=0;

fgets(string, 99, stdin);
len = strlen(string);
printf("%d\n", len);
char array[len-1];

for(pos=0; pos<(len-1); pos++)
    {
      array[j]=string[pos];
      j++;
    }

printf("%s", string);
printf("%s", array);

在终端我有: 狗狗(ENTER) 10(ENTER) 狗狗(ENTER) 狗狗@

我也尝试使用另一个符号删除\ 0,但它看不到'\ 0'或'\ n',请帮我PLZ!

3 个答案:

答案 0 :(得分:2)

在没有长度规范的情况下将指向非空终止字符串的指针传递给%s将调用未定义的行为。如果您因某种原因讨厌终止空字符,则必须指定要打印的长度。

试试这个:

#include <stdio.h>
#include <string.h>

int main(void) {
  int len;

  char string[100];
  int pos=0;

  fgets(string, 99, stdin);
  len = strlen(string);
  printf("%d\n", len);
  char array[len];

  for(pos=0; pos<len; pos++)
      {
        array[pos]=string[pos];
      }

  printf("%s", string);
  printf("%*s", len, array);

  return 0;
}

答案 1 :(得分:0)

TL; DR 你不想要null-terminator,很好。除此之外,您应该准备放弃那些属性,这些属性伴随着null-terminator的存在。您无法再将array用作字符串

详细说明,在您的代码中,您的数组array不是以空值终止的,因此它不能用作字符串%s格式说明符需要指向以null结尾的char数组的指针(简而言之, string

所以,在你的代码中,

printf("%s", array);

通过遍历已分配的内存来搜索空终止符来调用undefined behavior

但是,您可以使用for循环逐个元素地打印它。

答案 2 :(得分:0)

要复制而不使用终止null,请使用 memcpy( myCharArray, string, strlen(string) ); (假设myCharArray的大小是足够的)。要打印出结果,您需要使用循环而不是printf。