如何在 C 中打印出未知大小的字符串数组?
How to Print out an unknown size of string array in C?
我想打印出一个未知大小的字符串数组,例如
{"Green", "Yellow", "Black", "White", "Purple", "Saphire", .....} 并且可能没有 NULL 结尾。
我的代码如下:((char **) has to be the argument of PrintStringArray)
void PrintStringArray(char **list) {
int i = 0;
for (;; i++) {
char *p = list[i];
while (*p)
putchar((*p++));
putchar('\n');
}
}
void main()
{
char *list[] = {"Green", "Yellow", "Black", "White", "Purple", "Saphire"};
PrintStringArray(list);
return;
}
但是结果是,
绿色
黄色
黑色
白色
紫色
蓝宝石
分段错误(核心已转储)
我怎样才能避免分段错误?
我可以听听你的意见吗?
谢谢,
你不能:语言不支持这个。
程序员通常会做以下两件事之一:
每当传递数组时显式传递大小。
使用表示数组结束的元素值。在这种情况下,[=10=]
作为数组元素可能适合您。
为了避免分段错误,只需将函数更改为具有类型 size_t
的第二个参数,让您确切知道要处理多少个字符串 with.check 以下代码:
#include <stdio.h>
void PrintStringArray(char **list , size_t size);
int main()
{
char *list[6] = { "Green", "Yellow", "Black", "White", "Purple", "Saphire" };
PrintStringArray(list, 6);
return 0;
}
void PrintStringArray(char **list, size_t size) {
size_t i;
for (i = 0; i < size; i++) {
char *p = list[i];
while (*p)
putchar((*p++));
putchar('\n');
}
}
指针不保留信息,无论它们是指向单个对象还是例如数组的第一个元素。
考虑以下代码片段
char *p;
char c = 'A';
p = &c;
putchar( *p );
char s[] = "ABC";
p = s;
putchar( *p );
因此您必须自己提供有关指针是否指向数组元素的信息。
您可以通过两种方式做到这一点。第一个是指定序列中第一个元素被指针指向的元素的数量。或者序列必须像字符串一样具有标记值。
例如
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for ( int *p = a; p < a + sizeof( a ) / sizeof( *a ); ++p )
^^^^^^^^^^^^^^^^^^^^^^^^^^
{
printf( "%d ", *p );
}
printf( "\n" );
或
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = a;
do
{
printf( "%d ", *p );
} while ( *p++ != 0 );
^^^^^^^^^
printf( "\n" );
这些代码片段可以写成函数
void f( int a[], size_t n )
{
for ( int *p = a; p < a + n; ++p )
{
printf( "%d ", *p );
}
printf( "\n" );
}
或
void f( int a[] )
{
int *p = a;
do
{
printf( "%d ", *p );
} while ( *p++ != 0 );
printf( "\n" );
}
与打印字符串数组的方式相同。您将自己明确报告数组中元素的数量。或者您可以使用标记值,例如空指针或空字符串。
例如
#include <stdio.h>
void PrintStringArray( char *s[], size_t n )
{
for ( char **p = s; p < s + n; ++p )
{
puts( *p );
}
printf( "\n" );
}
int main( void )
^^^^^^^^^^^^^^^^
{
char *list[] =
{
"Green", "Yellow", "Black", "White", "Purple", "Saphire"
};
PrintStringArray( list, sizeof( list ) / sizeof( *list ) );
return 0;
}
或
#include <stdio.h>
void PrintStringArray( char *s[] )
{
char **p = s;
while ( *p != NULL )
{
puts( *p++ );
}
printf( "\n" );
}
int main( void )
^^^^^^^^^^^^^^^^
{
char *list[] =
{
"Green", "Yellow", "Black", "White", "Purple", "Saphire", NULL
^^^^
};
PrintStringArray( list );
return 0;
}
我想打印出一个未知大小的字符串数组,例如 {"Green", "Yellow", "Black", "White", "Purple", "Saphire", .....} 并且可能没有 NULL 结尾。 我的代码如下:((char **) has to be the argument of PrintStringArray)
void PrintStringArray(char **list) {
int i = 0;
for (;; i++) {
char *p = list[i];
while (*p)
putchar((*p++));
putchar('\n');
}
}
void main()
{
char *list[] = {"Green", "Yellow", "Black", "White", "Purple", "Saphire"};
PrintStringArray(list);
return;
}
但是结果是,
绿色
黄色
黑色
白色
紫色
蓝宝石
分段错误(核心已转储)
我怎样才能避免分段错误?
我可以听听你的意见吗?
谢谢,
你不能:语言不支持这个。
程序员通常会做以下两件事之一:
每当传递数组时显式传递大小。
使用表示数组结束的元素值。在这种情况下,
[=10=]
作为数组元素可能适合您。
为了避免分段错误,只需将函数更改为具有类型 size_t
的第二个参数,让您确切知道要处理多少个字符串 with.check 以下代码:
#include <stdio.h>
void PrintStringArray(char **list , size_t size);
int main()
{
char *list[6] = { "Green", "Yellow", "Black", "White", "Purple", "Saphire" };
PrintStringArray(list, 6);
return 0;
}
void PrintStringArray(char **list, size_t size) {
size_t i;
for (i = 0; i < size; i++) {
char *p = list[i];
while (*p)
putchar((*p++));
putchar('\n');
}
}
指针不保留信息,无论它们是指向单个对象还是例如数组的第一个元素。
考虑以下代码片段
char *p;
char c = 'A';
p = &c;
putchar( *p );
char s[] = "ABC";
p = s;
putchar( *p );
因此您必须自己提供有关指针是否指向数组元素的信息。
您可以通过两种方式做到这一点。第一个是指定序列中第一个元素被指针指向的元素的数量。或者序列必须像字符串一样具有标记值。
例如
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for ( int *p = a; p < a + sizeof( a ) / sizeof( *a ); ++p )
^^^^^^^^^^^^^^^^^^^^^^^^^^
{
printf( "%d ", *p );
}
printf( "\n" );
或
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = a;
do
{
printf( "%d ", *p );
} while ( *p++ != 0 );
^^^^^^^^^
printf( "\n" );
这些代码片段可以写成函数
void f( int a[], size_t n )
{
for ( int *p = a; p < a + n; ++p )
{
printf( "%d ", *p );
}
printf( "\n" );
}
或
void f( int a[] )
{
int *p = a;
do
{
printf( "%d ", *p );
} while ( *p++ != 0 );
printf( "\n" );
}
与打印字符串数组的方式相同。您将自己明确报告数组中元素的数量。或者您可以使用标记值,例如空指针或空字符串。
例如
#include <stdio.h>
void PrintStringArray( char *s[], size_t n )
{
for ( char **p = s; p < s + n; ++p )
{
puts( *p );
}
printf( "\n" );
}
int main( void )
^^^^^^^^^^^^^^^^
{
char *list[] =
{
"Green", "Yellow", "Black", "White", "Purple", "Saphire"
};
PrintStringArray( list, sizeof( list ) / sizeof( *list ) );
return 0;
}
或
#include <stdio.h>
void PrintStringArray( char *s[] )
{
char **p = s;
while ( *p != NULL )
{
puts( *p++ );
}
printf( "\n" );
}
int main( void )
^^^^^^^^^^^^^^^^
{
char *list[] =
{
"Green", "Yellow", "Black", "White", "Purple", "Saphire", NULL
^^^^
};
PrintStringArray( list );
return 0;
}