使用C输出字符串的三元运算

Pie*_*ard 5 c ternary-operator string-literals

有人可以解释为什么这个简单的三元运算甚至不会在C中编译?

void main(int argc, char *argv[]){
    int a = atoi(argv[1]);
    char foo[] = (a == 1) ? "bar1" : "bar2";
}
Run Code Online (Sandbox Code Playgroud)

特别是字符串似乎是一个问题.

Kev*_*eid 10

字符串文字"bar",在表达式中使用时(在这种情况下,三元运算符内),是预分配存储器的指针.您不能使用指向数据的指针初始化数组,只能使用文字("..."{...}).

相反,您可以将其分配给char *:

const char *foo = (a == 1) ? "bar1" : "bar2";
Run Code Online (Sandbox Code Playgroud)

不会复制文字但指向它,所以你不应该修改它的元素foo.如果您需要副本,可以使用memcpy,前提是您知道声明数组有多大:

char foo[5];
memcpy(foo, (a == 1) ? "bar1" : "bar2", sizeof foo);
Run Code Online (Sandbox Code Playgroud)

如果你特别希望能够分配内容,那么就有一个技巧; struct无论struct包含什么内容,都可以隐式复制使用赋值的内容(以及从函数返回等等),并且可以将字符数组放在struct:

typedef struct { 
  char contents[5];
} mystring;

mystring foo = (a == 1) ? (mystring){"bar1"} : (mystring){"bar2"};
// You can also use assignments.
foo = (mystring){"baz"};
Run Code Online (Sandbox Code Playgroud)

就像第二个选项一样,当你这样做时,你必须在struct声明中为数组选择一个固定的大小.如果你有无限长度的字符串,那么你必须使用指针.