如何在C语言中打印未调整大小的数组

如何在C语言中打印未调整大小的数组,c,multidimensional-array,printf,C,Multidimensional Array,Printf,我是C语言的新手,正试图弄明白如何用C语言打印一个大小不一的数组。使用下面的代码,我的输出看起来很奇怪,但我不知道原因 我需要一些帮助: main() { int i; char *prt_1st; char list_ch[][2] = {'1','a', '2','b', '3','c','4','d','5','e','6','f' }; prt_1st = list_ch; for (i = 0; i < sizeof(list_ch);

我是C语言的新手,正试图弄明白如何用C语言打印一个大小不一的数组。使用下面的代码,我的输出看起来很奇怪,但我不知道原因

我需要一些帮助:

main()
{
    int i;
    char *prt_1st;
    char list_ch[][2] = {'1','a', '2','b', '3','c','4','d','5','e','6','f' };

    prt_1st = list_ch;
    for (i = 0; i < sizeof(list_ch); i++) {
        prt_1st +=  i;
        printf("The content of the array is %c under %d position\n", *prt_1st, i);
    }
}
main()
{
int i;
字符*prt_第一;
字符表[2]={'1','a','2','b','3','c','4','d','5','e','6','f'};
prt_1st=列表;
对于(i=0;i
通过获取元素数量,可以打印未定义长度的数组
  • 元素的总大小
  • 元素的单个大小

    在这种情况下

    sizeof(list_ch) returns Total array size. sizeof(char) returns an individual character size. therefore, Total number of elements (n) = sizeof(list_ch)/sizeof(char) 或者,您可以通过以下方式使用增量解决方案

    
    
    printf("%s", list_ch)
    ++list_ch 
    
    
    This will automatically put your ptr to the next index in your array
    希望这有帮助:)

    好的,代码中的问题是

    prt_1st +=  i;
    
    它将指针增加i倍,但您需要的是将指针增加1倍

    这是修改后的代码

    int main()
    {
        int i;
        char *prt_1st;
        char list_ch[][2] = {'1','a', '2','b', '3','c','4','d','5','e','6','f' };
    
        prt_1st = list_ch[0];
    
        for (i = 0; i < sizeof(list_ch); i++) 
        {
            //prt_1st +=  i;    
            printf("The content of the array is %c under %d position\n", *prt_1st, i);
            prt_1st =  prt_1st + 1;
        }
        return 0;
    }
    
    intmain()
    {
    int i;
    字符*prt_第一;
    字符表[2]={'1','a','2','b','3','c','4','d','5','e','6','f'};
    prt_1st=列表[0];
    对于(i=0;i
    以下功能可用于处理可能的对齐问题:

    int main()
    {
        int i, j;
        char (*prt_1st)[2];
        char list_ch[][2] = {{'1','a'}, {'2','b'}, {'3','c'},{'4','d'},{'5','e'},{'6','f'} };
    
        for (i = 0; i < sizeof(list_ch)/sizeof(list_ch[2]); i++) {
            for (j=0; j<sizeof(list_ch[2]); j++)
                printf("The content of the array is %c under %d,%d position\n", list_ch[i][j], i,j);
        }
        return(0);
    }
    
    intmain()
    {
    int i,j;
    字符(*prt_1st)[2];
    字符列表{'1','a'},{'2','b'},{'3','c'},{'4','d'},{'5','e'},{'6','f'};
    对于(i=0;i对于(j=0;j,您应该声明并初始化一个2d数组,其中第一个大小未指定,如下所示:

    char list_ch[][2] = {{'1','a'}, {'2','b'}, {'3','c'}, {'4','d'}, {'5','e'}, {'6','f'}};
    
    这样做,
    sizeof(list_ch)
    的结果将是
    12
    。数组的元素在内存中应该是连续的(除非PualOgilvie指出,编译器决定让每一行从字边界开始,从而导致不一致),您可以使用如下指针在循环中扫描它们:

    int i;
    char *prt_1st = list_ch;
    for (i = 0; i < sizeof(list_ch); i++) {
        printf("Position: %d Element: %c\n", i, prt_1st[i]);
    }
    
    inti;
    char*prt\u 1st=列表;
    对于(i=0;i
    或者保持2D特性:

    char *prt_1st;
    int dim = sizeof(list_ch) / sizeof(list_ch[0]);
    for (i = 0; i < dim; i++) {
        prt_1st = list_ch[i];
        printf("The first char of row %d is %c\n", i, prt_1st[0]);
    }
    
    char*prt_第一;
    int dim=sizeof(list_ch)/sizeof(list_ch[0]);
    对于(i=0;i
    您的数组是二维的,但您正在以一维方式初始化它。这不好。是的,它是“大小”的,因为大小是从初始值设定项推断出来的。“未大小数组”是什么?对
    sizeof
    运算符进行一些研究。虽然此处使用不当,但这是解决问题的方法。您应该执行
    prt_1st++
    ,而不是使用
    i
    递增。可能存在对齐问题,因为编译器可能决定让每行从字边界(32/64位边界)开始,但一行只有2个字节。“奇怪的输出”并不是一个非常明确的问题陈述。在问题中包括实际输出。对于“元素的单个大小”,建议使用直接方法
    sizeof(*list\u ch)
    sizeof(list\u ch[0])
    您已经知道数据类型将是相同的,因此每次通过大小读取数据类型就足够了,它读取已知数据类型的速度比某些数组快。感谢您的帮助=)在我的解决方案中
    sizeof(list_ch[2])
    有误导性。它应该是
    sizeof(list_ch[0])
    (第一行)或
    sizeof(char[2])
    。有什么建议吗?
    sizeof(list\u ch[0])
    对我有用。你为什么认为
    list\u ch[2]
    有误导性?我在做一本书中的练习。数组的定义应该保持不变。不过谢谢你的代码。=)@Bob,
    list\u ch[2]
    有误导性,因为
    2
    表示第二(三)个行,而不是维度的大小。为什么编译器要在内存中连续排列它们?为什么编译器不应该让每一行从字边界(32/64位边界)开始但是一行只有2个字节?@PaulOgilvie老实说,我原以为标准中有规定,但我看到了你的观点你的代码也很有效。Danke!我现在看到了。谢谢!
    char *prt_1st;
    int dim = sizeof(list_ch) / sizeof(list_ch[0]);
    for (i = 0; i < dim; i++) {
        prt_1st = list_ch[i];
        printf("The first char of row %d is %c\n", i, prt_1st[0]);
    }