如何打印出由 C 中的 char ** 创建的字符串(数组)数组?

Jer*_* wu 1 c arrays loops for-loop c-strings

我是 C 的新手,并试图使用 char ** 创建一个数组,但我在打印它时遇到了问题。有没有办法打印出来,或者我不应该用这种方式来创建一个字符串数组?

int main()
{
    char **a = {"abc", "ddd", "ccc", "aaa"};

    for (size_t i = 0; i < 4; i++){
        printf("%s\n", a+i);  // only print out "abc" correctly
//        printf("%s\n", *(a+i));  doesn't work
//        printf("%s\n", a[i]);  doesn't work
    }

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Vla*_*cow 5

本声明

char **a = {"abc", "ddd", "ccc", "aaa"};
Run Code Online (Sandbox Code Playgroud)

是不正确的。标量类型可以仅使用大括号中的单个表达式进行初始化。

如果你想声明一个指针数组,那么你应该写

char * a[] = {"abc", "ddd", "ccc", "aaa"};
Run Code Online (Sandbox Code Playgroud)

要输出它,你可以写

for (size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++){
    puts( a[i] );
}
Run Code Online (Sandbox Code Playgroud)

或者

char * a[] = {"abc", "ddd", "ccc", "aaa"};
const size_t N = sizeof( a ) / sizeof( *a );

for (size_t i = 0; i < N; i++){
    puts( a[i] );
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是声明一个二维数组,例如

char a[][4] = {"abc", "ddd", "ccc", "aaa"};
Run Code Online (Sandbox Code Playgroud)

可以像上图一样输出。

for (size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++){
    puts( a[i] );
}
Run Code Online (Sandbox Code Playgroud)

如果你想声明一个char **像这样类型的对象

char **a = /*...*/;
Run Code Online (Sandbox Code Playgroud)

然后你可以用复合文字初始化它。

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    enum {  N = 4 };
    char **a = ( char * [N] ){"abc", "ddd", "ccc", "aaa"};
    
    for ( size_t i = 0; i < N; i++ )
    {
        puts( a[i] );
    }
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

abc
ddd
ccc
aaa
Run Code Online (Sandbox Code Playgroud)