【问题标题】:How to make string from an character? [closed]如何从一个字符生成字符串? [关闭]
【发布时间】:2020-12-11 17:27:27
【问题描述】:

我正在尝试将字符转换为字符串,但如果我这样做......

 char* Make_String(char ch)
 {
   char *d = " "; //(char*)malloc(2*sizeof(char));
   d[0] = ch;
   d[1] = '\0';

   return d;
 }

... 那么输出不包含我期望的字符。另一方面,如果我通过malloc 动态分配内存(如// 之后的注释部分所示),那么它工作正常。请解释为什么会这样。

【问题讨论】:

  • 你不能修改字符串文字。
  • 好的。著名的 。但这如何选择性地避免在最终结果中打印操作数。
  • 通过给你的程序提供未定义的行为。您的 C 实现能力范围内的任何事情都可能发生。该语言没有为解释您观察到的特定行为提供依据。然而,猜测一下,在这种情况下可能发生的情况是您尝试修改的单空格字符串文字根本没有被修改。

标签: c string memory dynamic character


【解决方案1】:

不应更改字符串文字。尝试这样做会调用Undefined Behavior。

当使用指向字符串字面量的指针时,您应该使用const 即const char *d = " ";,如果在您的代码中尝试更改字符串字面量,您会遇到编译错误并避免在程序中引入UB。

如果您想要一个可以更改的字符串,请使用char d[] = " ";。这会将字符串文字复制到您的 char 数组中,因此您可以随意更改。

如果您想从函数中返回字符串,则需要使用您使用的malloc 方法或使用静态字符数组static char d[] = " ";

使用 malloc 时别忘了在使用后释放内存。

【讨论】:

  • "字符串字面量不能更改。"更像是“不应更改字符串文字”。尝试这样做的是UB。它可能有效,也可能无效。
  • @chux-ReinstateMonica,是的,根据 UB 的定义。 StillI,我怀疑它是否可以工作,但它是可能的。
  • 一种令人惊讶的 UB 形式是代码成功更改了此处的 " " 之类的字符串文字,但发现更改了 all 程序出现的 " "。 UB就是这样。
【解决方案2】:

d[0] = ch; 尝试更改字符串文字 的内容,这是未定义的行为 (UB)。

char *d = " ";
d[0] = ch;  // UB

分配工作是因为内存是可变的。

char *d = malloc(2*sizeof(char));
d[0] = ch; // OK

Make_String(char ch) 的替代方案是字符串文字。示例:将char 转换为其十六进制值。

char hex_char = 'b';
char *s = (char [2]){ hex_char }; // string literal: initializes with 'b', '\0'
int val = (int) strtol(s, 0, 16);

【讨论】:

  • 既然来了,你觉得this怎么样?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2019-10-10
  • 2021-12-04
相关资源
最近更新 更多