遍历还包含未使用元素的字符串数组

问题描述 投票:0回答:2

问题:我只想打印数组names中定义的三个元素,而不更改定义的数组大小。该程序当前将打印出这三个元素,但在遍历所有20个元素时也将打印出十七行。

问题:当如何检查一个没有至少一个字符的值的元素时,如何创建循环打破条件?换句话说,我如何不打印出多余的十七行?

#include <stdio.h>
#define MAX_I 20
#define MAX_J 20

int main() {
    char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};

    // First example
    printf("Example 1:\n");
    for (int i = 0; i < MAX_I; i++) {
        for (int j = 0; j < MAX_J; j++) {
            printf("%c", names[i][j]);
        }
        printf("\n");
    }

    // Second example
    printf("\nExample 2:\n");
    for (char* iter : names) {
        printf("%s\n", iter);
    }
}
c++ arrays for-loop initialization c-strings
2个回答
0
投票

一个空的C字符串的第一个(也是唯一一个!)元素设置为'\0'(又名0)。

您的数组声明将对其余元素进行零初始化,因此您可以依靠此规则。

因此:

#include <stdio.h>
#define MAX_I 20
#define MAX_J 20

int main() {
    char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};

    // First example
    printf("Example 1:\n");
    for (int i = 0; i < MAX_I; i++) {

        // *** This block is new ***
        if (names[i][0] == '\0')
        {
           // Empty string! Skip this, and all following
           break;
        }

        for (int j = 0; j < MAX_J; j++) {

            // *** This block is new ***
            if (names[i][j] == '\0')
            {
               // End of string!
               break;
            }

            printf("%c", names[i][j]);
        }
        printf("\n");
    }

    // Second example
    printf("\nExample 2:\n");
    for (char* iter : names) {

        // *** This block is new ***
        if (iter[0] == '\0')
        {
           // Empty string! Skip this, and all following
           break;
        }

        printf("%s\n", iter);
    }
}

注意,在您的第一个示例中,我还自由地跳过打印结尾的null。


0
投票

二维数组的每个元素(类型为char[MAX_I]的一维数组]

char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};

未显式初始化的是隐式初始化的,如

{ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }

其中pf零的个数等于MAX_I。因此,实际上,未明确初始化的元素包含空的c字符串。

因此,输出数组的显式初始化元素的循环可以通过以下方式查看]]

for ( size_t i = 0; i < MAX_I && *names[i]; i++ )
{
    std::cout << names[i] << '\n';
}   

for ( size_t i = 0; i < MAX_I && names[i][0] != '\0'; i++ )
{
    std::cout << names[i] << '\n';
}   

或者如果是C程序,则>

for ( size_t i = 0; i < MAX_I && *names[i]; i++ )
{
    puts( ames[i] );
}   

for ( size_t i = 0; i < MAX_I && names[i][0] != '\0'; i++ )
{
    puts( ames[i] )
}   
© www.soinside.com 2019 - 2024. All rights reserved.