将char转换为1个字符的以null结尾的字符串

Art*_*yer 0 c arrays string pointers char

说我char喜欢:

char a = 'a';
Run Code Online (Sandbox Code Playgroud)

我怎样才能将它转换成这样的东西:

char* b = "a";
// b = {'a', '\0'};
Run Code Online (Sandbox Code Playgroud)

(技术上2 char秒,因为它应该为空终止)

我的用例是三元表达式,我想将其转换'\0'"\\0"({ '\\', '0', \0' }),但其他每个字符都是一个字母,我想保持不变.

letter == '\0' ? "\0" : letter;
Run Code Online (Sandbox Code Playgroud)

这有效,但会产生关于不匹配类型的错误.我还有其他可能需要使用的东西.

我尝试过的事情:

letter == '\0' ? "\\0" : letter;
// error: pointer/integer type mismatch in conditional expression [-Werror]

letter == '\0' ? "\\0" : { letter, '\0' };
//                       ^
// error: expected expression before ‘{’ token

letter == '\0' ? "\\0" : &letter;
// No error, but not null terminated.

letter == '\0' ? "\\0" : (char*) { letter, '\0' };
//                                 ^~~~~~
// error: initialization makes pointer from integer without a cast [-Werror=int-conversion]
// 
// ter == '\0' ? "\\0" : (char*) { letter, '\0' };
//                                         ^~~~
// error: excess elements in scalar initializer [-Werror]
// Seems to want to initialise a char* from just the first thing in the list

char string[2] = {letter, 0};
letter == '\0' ? "\\0" : string;
// Makes a string even if it is `'\0'` already. Also requires multiple statements.

char string[2];
letter == '\0' ? "\\0" : (string = {letter, 0});
//                                 ^
// error: expected expression before ‘{’ token
Run Code Online (Sandbox Code Playgroud)

alk*_*alk 5

最短的

char c = 'a';
char s[2] = {c};  /* Will be 0-terminated implicitly */

puts(s);
Run Code Online (Sandbox Code Playgroud)

打印:

a
Run Code Online (Sandbox Code Playgroud)

如果它只是能够将角色传递给puts()(或类似),你甚至可以使用复合文字

puts((char[2]){c});
Run Code Online (Sandbox Code Playgroud)

要么

{
  puts((char[2]){c});
}
Run Code Online (Sandbox Code Playgroud)

后者立即释放复合文字使用的内存.

两个都打印

a
Run Code Online (Sandbox Code Playgroud)

同样.

  • @PatrickRoberts数组的特例,当你初始化一个或多个元素时,剩下的将被零初始化. (2认同)