首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中打印未知大小的字符串数组?

如何在C中打印未知大小的字符串数组?
EN

Stack Overflow用户
提问于 2016-03-11 10:33:05
回答 3查看 5.1K关注 0票数 2

我想打印一个大小未知的字符串数组,例如{“绿色”、“黄色”、“黑色”、“白色”、“紫色”、“蓝宝石”、……},并且可能没有空结尾。我的代码如下:((char **)必须是PrintStringArray的参数)

代码语言:javascript
复制
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;
}

但结果是,

绿色

黄色

黑色

白色

紫色

蓝宝石

分段故障(堆芯倾弃)

如何避免分割错误?我可以听听你的意见吗?谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-11 11:09:54

指针不保存信息,无论它们是指向单个对象,还是例如数组的第一个元素。

考虑下面的代码片段

代码语言:javascript
复制
char *p;

char c = 'A';

p = &c;

putchar( *p );

char s[] = "ABC";

p = s;

putchar( *p );

因此,您必须为自己提供关于指针是否指向数组元素的信息。

你可以用两种方式来做。第一个是指定序列中的元素数,其中第一个元素由指针指向。或者序列必须像字符串一样具有一个哨位值。

例如

代码语言:javascript
复制
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" );

代码语言:javascript
复制
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

int *p = a;

do
{
    printf( "%d ", *p );
} while ( *p++ != 0 );
          ^^^^^^^^^

printf( "\n" );

这些代码片段可以编写为函数。

代码语言:javascript
复制
void f( int a[], size_t n ) 
{
    for ( int *p = a; p < a + n; ++p )
    {
        printf( "%d ", *p );
    }
    printf( "\n" );
}

代码语言:javascript
复制
void f( int a[] )
{
    int *p = a;

    do
    {
        printf( "%d ", *p );
    } while ( *p++ != 0 );

    printf( "\n" );
}

与打印字符串数组的方式相同。您可以自己显式地报告数组中的元素数。或者可以使用哨兵值,例如空指针或空字符串。

例如

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
#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;
}
票数 3
EN

Stack Overflow用户

发布于 2016-03-11 10:44:01

你不能:语言不支持这一点。

程序员通常做两件事中的一件:

  1. 每当传递数组时,显式传递大小。
  2. 使用表示数组结束的元素值。在这种情况下,作为数组元素的\0可以为您工作。
票数 3
EN

Stack Overflow用户

发布于 2016-03-11 11:05:55

为了避免分段错误,只需将函数更改为具有size_t类型的第二个参数,以让您确切地知道要处理多少字符串,如下代码所示:

代码语言:javascript
复制
#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');
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35937860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档