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)
本声明
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)