【问题标题】:Print multidimensional array of chars打印多维字符数组
【发布时间】:2016-11-28 12:17:07
【问题描述】:

我正在尝试在 C 中打印以下二维字符串数组,如下所示:

char text[10][80] = {
    "0", "Zero",
    "1", "One",
    "2", "Two",
    "3", "Three",
    "4", "Four",
};

输出应该是这样的:

0 Zero
1 One
2 Two
3 Three 
4 Four 

我写了下面的程序:

#include <stdio.h>

int main()
{
    char text[10][80] = {
        "0", "Zero",
        "1", "One",
        "2", "Two",
        "3", "Three",
        "4", "Four",
    };
    int i, j;
    for(i=0; i<6; i++)
    {
        for(j=0; j<1; j++)
        {
            printf("%s ", text[i]);
        }
    }
    return 0;
}

它没有为我提供所需的输出。我尝试了几种方法,但没有运气。

【问题讨论】:

  • for(j=0; j&lt;1; j++) 目的是什么?
  • 你需要在 printf 语句中打印像 text[i][j] 这样的数组元素。
  • 创建列空间。
  • 实际输出是多少?您认为错误可能是什么?
  • FWIW,我不认为这是重复的。这只是打印固定长度字符串的一维数组的一种棘手方法。这与 IMO 的另一个问题不同。

标签: c arrays string output-formatting


【解决方案1】:

您可以修改循环以获得所需的输出 -

for(i=0; i<9; i=i+2){
    printf("%s %s\n", text[i], text[i+1]);
}

此循环将以所需格式打印索引为ii+1 的数组的内容。类似索引处的值 0123 等等。

【讨论】:

  • 这正是我想要的。非常感谢您的建议。
  • @Sayeed 很高兴它有帮助。
  • 为什么不用老套的 i&lt;10i+=2 呢?我认为一些解释性的词可能会有所帮助:上面的格式具有误导性
  • not true ideone.com/1ikFQP 循环不会溢出,因为 10 不是 &lt; 10。而且由于数组有 10 个元素,所以最好重复字面量 10。
  • 抱歉打扰了,解释走错了。该数组有 10 个元素,这些元素本身就是数组,格式旨在打印 2x5 表。我认为 OP 对看起来像数组的事物与真正是数组的事物之间的关系感到困惑。
【解决方案2】:

您的数据被组织为一个 10 元素的 char 数组,每个数组有 80 个字符(包括零终止符字符)的空间。1 偶数元素 0、2、4 等包含数字文字,奇数元素 1、3、4 等包含这些数字的名称。顺便说一句:80 个字符对于这样的短字符串来说是很大的空间。

输出应该被格式化为两列,第一列是偶数元素,第二列是奇数元素,每一行看起来像这样:

numbername

至于在循环中执行此操作,我发现 根据索引为printf 选择格式参数 很有趣2i是奇数还是偶数:3

#include <stdio.h>

char text[10][80] = {
    "0", "Zero",
    "1", "One",
    "2", "Two",
    "3", "Three",
    "4", "Four",
};

int main(void) {
    int i;
    for (i=0; i<10; i++) {
        printf( (i&1) ? "%s\n" : "%s\t", text[i]);
    }
    return 0;
}

1 尽管编写和格式化尽可能接近应该解决的问题的代码通常是一个好主意,但它有时会混淆真正发生的事情。这就是编译器“看到”的:

char text[10][80] = {
    "0",
    "Zero",
    "1",
    "One",
    "2",
    "Two",
    "3",
    "Three",
    "4",
    "Four",
};

...这是初始化用作字符串的 char 数组的便捷简写形式,它在内部扩展为 this

char text[10][80] = {
    {'0'},
    {'Z', 'e', 'r', 'o'},
    {'1'},
    {'O', 'n', 'e'},
    {'2'},
    {'T', 'w', 'o'},
    {'3'},
    {'T', 'h', 'r', 'e', 'e'},
    {'4'},
    {'F', 'o', 'u', 'r'},
};

会自动添加终止的 `\0' 字符,因为每个初始化的值少于其元素的数组都会被默认值填充。

2 我发现它最能反映给定的任务。如果您对“最快”代码感兴趣,ameyCU's answer 似乎是一个不错的方法。

3查看这段代码在live demo中运行。

【讨论】:

  • @Sayeed 我希望它不止于此,代码不是最理想的,但解释应该有助于更好地理解任务。 :)
【解决方案3】:

从您的描述中不清楚您是想要一个二维字符串数组还是一个二维字符数组(因此是一维字符串数组)。如果第一个是真的,那么试试:

int main()
{
    char *text[10][80] = {
        {"0", "Zero",},
        {"1", "One",},
        {"2", "Two",},
        {"3", "Three",},
        {"4", "Four",},
    };
    int i, j;
    for(i=0; i<5; i++)
    {
        for(j=0; j<2; j++)
        {
            printf("%s ", text[i][j]);
        }
        printf("\n");
    }
    return 0;
}

【讨论】:

  • @RudyVelthuis:数组的“正确性”是什么意思?
  • 你的建议类似于char* text[5][2] 好主意,但还没有写下来:)
  • 关于“正确性”:{"0", "Zero"} 初始化 char 指针的 2 元素数组或 char 数组的 2 元素数组(至少大小为 5)。
  • @Wolf: char * text[5][2] 确实会匹配这个答案中的数组结构。
  • @Wolf :在这种情况下,{"0", "Zero"} 以以下方式初始化 80 个字符串数组的前两个元素:text[0][0] 为字符串“0”,text[0][1] 为字符串“零” .然后{"1", "One",}text[1][0] 初始化为字符串“1”,将text[1][1] 初始化为字符串“One”。我的感觉是,这是 OP 在询问多维字符串数组时正在寻找的解决方案。
【解决方案4】:

好吧,你可以按照一个简单的逻辑,打印所有text[i]s,如果索引是奇数(偶数迭代),则添加一个换行符,比如

for(i=0; i<10; i++)
{
        printf("%s\t", text[i]);

    if ( i%2 ) puts("");
}

否则,另一种奇特的方法是在打印语句本身中插入 (append) tabnewline关于迭代(索引)数,比如

for(i=0; i<10; i++)
{
    printf("%s%c", text[i], i%2?'\n':'\t');
}

【讨论】:

  • 多么有创意的缩进:) ...说真的:这绝对有道理。也许你应该说一下puts("")
  • printf("%s%c", text[i], i%2?'\n':'\t');
  • @pmg 一种相当奇特的方式,让我在我的答案中添加它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2017-12-29
  • 1970-01-01
相关资源
最近更新 更多