【问题标题】:Copy a string into another without \0将一个字符串复制到另一个不带 \0 的字符串中
【发布时间】:2016-07-28 15:24:52
【问题描述】:

我必须在没有\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) 狗狗@

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

【问题讨论】:

  • 所以你从字符串中删除空终止符,然后将其打印为空终止字符串......?
  • 只是指出 => fgets(string, 99, stdin); ->> fgets(string, 100, stdin); , fgets 会照顾 '\0'
  • @ameyCU 你从哪里得到scanf()
  • 如果不移动\0,printf将看不到字符串的结尾,会打印垃圾。
  • 请解释一下你真正想要做什么

标签: c arrays string fgets null-terminated


【解决方案1】:

将指向非空终止字符串的指针传递给%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;
}

【讨论】:

  • 嗨!感谢您的回答。我必须删除 \0 因为我必须对字符串进行标记,而 \0 最后一个标记给我带来了很多问题。但它不以这种方式工作..
  • @Nina06 那么分词器一定是错误的,因为 C 中的字符串表示为以空字符结尾的字符数组。
  • @Nina06 或者你的意思是\0的字面意思是两个字符\和0,而不是字符代码为0的字符?
  • 嗯,我想它是\0...实际上它是输入:\n
  • char* lf; if ((lf = strchr(string, '\n')) != NULL) *lf = '\0'; 这是我用来删除换行符的。
【解决方案2】:

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


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

所以,在你的代码中,

printf("%s", array);

调用undefined behavior,通过分配内存寻找空终止符。

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

【讨论】:

  • 感谢您的回答!我现在真的不知道该怎么做,因为我必须对字符串进行标记......当然没有 \0 !!!!!!
  • @Nina06 恐怕在那种情况下,您需要自己编写解析器,标准解析器需要一个以空值结尾的数组。
  • "但是,可以使用 for 循环逐个元素地打印它。" --> 可以使用printf("%*s", len, array);
【解决方案3】:

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

【讨论】:

  • Hmmm "要打印出结果,您需要使用循环而不是 printf。" --> 也许printf("%*s", len, array);
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2014-05-26
相关资源
最近更新 更多