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

时间:2012-10-02 16:16:25

标签: c ternary-operator string-literals

有人可以解释为什么这个简单的三元操作甚至不能编译,在C?

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

特别是字符串似乎有问题。

2 个答案:

答案 0 :(得分:10)

字符串文字"bar"在表达式中使用时(在本例中,在三元运算符内),是指向预分配内存的指针。您无法使用指向数据的指针初始化数组,只能使用文字("..."{...})。

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

const char *foo = (a == 1) ? "bar1" : "bar2";

这将制作文字的副本,但指向它,因此您不应修改foo的元素。如果您需要副本,可以使用memcpy,前提是您知道声明数组有多大:

char foo[5];
memcpy(foo, (a == 1) ? "bar1" : "bar2", sizeof foo);

如果您特别希望能够分配内容,那么有一个技巧可以做到这一点;无论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"};

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

答案 1 :(得分:2)

您的三元操作没问题,但是您无法使用“bar1”和“bar2”所在的预分配内存初始化数组。

int a = atoi(argv[1]);
char foo[5];
memcpy(foo,((a == 1) ? "bar1" : "bar2"), 5); 

继续做你正在做的事情的可能方法。