在C中创建字符串的不同方法

在C中创建字符串的不同方法,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,我想了解创建字符串的每种方法的优缺点,有人能帮我吗 char x[] = {'a', 'b', 'c', '\0'}; 或 或 我忘了其他方法了吗?多谢各位 char x[]={{'a'},{'b'},{'c'},{'\0}}; 除了'\0之后缺少的撇号之外,这通常应该是字符x[]={'a','b','c','\0'}。C语法允许使用单个标量初始值设定项使用额外的大括号,但编译器通常会对此发出警告,因为大括号通常用于指示聚合对象(如数组或结构)的组成,这表明存在错误 撇号固定后,这将x定义为

我想了解创建字符串的每种方法的优缺点,有人能帮我吗

char x[] = {'a', 'b', 'c', '\0'};

我忘了其他方法了吗?多谢各位

char x[]={{'a'},{'b'},{'c'},{'\0}};

除了
'\0
之后缺少的撇号之外,这通常应该是
字符x[]={'a','b','c','\0'}。C语法允许使用单个标量初始值设定项使用额外的大括号,但编译器通常会对此发出警告,因为大括号通常用于指示聚合对象(如数组或结构)的组成,这表明存在错误

撇号固定后,这将
x
定义为四个字符的数组,即a、b、c和空字符。这种格式很乏味,因此实际上没有人以这种方式定义数组,除非有一些特殊情况,例如需要使用表达式定义一个字符,或者当数组被定义为字符串以外的其他用途时,并且希望强调这一点

char x[]="abc";
这将
x
定义为与上述四个字符相同。这是定义字符数组的常用方法

这两种初始化方法在C语义上没有区别;两者都定义了相同的数组,所以在它们之间选择的唯一原因是人类如何与它们交互,这更容易阅读,更容易编辑而不会出错,等等

char *p;
p="abc";
这是一个定义和任务。它最好写成
char*p=“abc”除非有理由不这样做


这将
p
定义为指向与上面相同的四个字符的静态数组的指针。仅用于定义数组并不常见,因为它创建了一个不必要的指针,
p
。它通常只在需要一个最初指向静态数组但以后可能会更改的指针时使用。

当然还有另一种方法。您可以立即初始化或分配具有复合文字的指针。这种初始化创建指向可修改字符串的指针

char *p = (char[]){"ASDF"};

int main()
{
    p[2] = 'X';
    printf("%s\n", p);
}


使用
malloc()
(和朋友)


使用(不同于字符串文字)


你认为利与弊是什么?最后一个例子并不等同于前两个。但总的来说,这个问题的范围太广了。第一种方法的缺点是它不起作用。除了
'\0
后面缺少的撇号外,大括号太多。它应该是
charx[]={'a','b','c','\0'}
char x[]={'a','b','c','\0'}
字符x[]=“abc”是等效的定义<代码>字符*p=“abc”不等同于其中任何一个。例如,
x[0]='q'有效,但
p[0]='q'是未定义的行为。还有另一种方法。它将指针分配给可修改的
char
array。C语法允许
charx[]={{a'}、{b'}、{C'}、{0'}
char *p;
p="abc";
char *p = (char[]){"ASDF"};

int main()
{
    p[2] = 'X';
    printf("%s\n", p);
}
char x[] = {'a', 'b', 'c', '\0'};
char x[] = "abc";
char *p = malloc(4);
if (!p) { /* error; */ exit(EXIT_FAILURE); }
strcpy(p, "abc");
free(p);
char *example(char *p) {
    p[0] = 'A';
    p[2] = 'C';
    return p;
}
example((char[4]){"abc"}); // unnamed object