【问题标题】:% symbols keep printing when trying to print out a char 2D array in C% 符号在 C 中尝试打印 char 2D 数组时继续打印
【发布时间】:2016-01-26 04:35:05
【问题描述】:

我是 C 新手,我只是想打印出两个 2 数组。 这个错误整天困扰着我,我不确定发生了什么。

#include<stdio.h>

void run(int);

main()
{
    run(5);
    return 0;
}

//Have to make it a character array as it needs to 
//store numbers AND commas. 
run(int x)
{
    int size = 2*x -1;
    char array[size][size];
    int i = 0;
    int j = 0;
    for( i; i < size; i++){
        for(j; j< size; j++){
            array[i][j] = '1';
        }
    }

    int k = 0;
    int l = 0;
    for( k; k < size; k++){
        for(l; l< size; l++){
            printf( "%c" , array[l][k]);
        }
        printf("%\n", "");
    } 
}

这是我得到的输出:

1%
%
%
%
%
%
%
%
%

【问题讨论】:

  • 您希望printf("%\n", "") 打印什么? % 之后没有格式化运算符。
  • 我期待只打印一个新行 - 我想我应该将其格式化为一个字符然后......
  • for(j; j&lt; size; j++){ - (j; 没有做任何事情,可能意味着for(j = 0; j&lt; size; j++){l 的问题相同,ik 的问题类似(尽管无害)。
  • 您应该真正学习如何使用调试器并逐步执行您的代码。这将是你作为程序员学到的最重要的一课。
  • @Amit 把它放在一个答案中

标签: c arrays formatting


【解决方案1】:

你的代码有几个错误:

最大的问题是你没有在你应该初始化循环计数器:

for(i; i < size; i++){
  for(j; j < size; j++){

这样,ij 将保持在 for 语句之前的状态。这些陈述的第一部分根本没有做任何事情。虽然这对i 是无害的(因为它在for 之前被初始化为0),但对于j 来说却是毁灭性的,它永远不会回到0。你的代码应该是:

for(i = 0; i < size; i++){
  for(j = 0; j < size; j++){

kl 也存在同样的问题,应该应用同样的修复:

for(k = 0; k < size; k++){
  for(l = 0; l < size; l++){

接下来,您将在阵列中“轮换”访问。当你用值填充数组时,你的外部循环中有i,内部循环中有j,你将它们用作[i][j]

array[i][j] = '1';

将其视为Out & In --> [Out][In]

当你打印数组时,你“旋转”,k 是外部的,l 是内部的,你将它们用作[l][k]

printf("%c", array[l][k]);

这就像[In][Out]
虽然这不是问题,因为所有值都相同 ('1'),并且矩阵是方形的(宽度 == 高度),但它不适用于其他值或维度,并且令人困惑。


最后,您尝试打印新行是错误的。您有一个 % 说明符,但之后您并没有真正使用任何有效字符,而且您也不需要它,只需打印:

printf("\n");

所以,总而言之,代码应该是这样的:

run(int x)
{
    int size = 2*x -1;
    char array[size][size];
    int i,j;
    for(i = 0; i < size; i++){
        for(j = 0; j < size; j++){
            array[i][j] = '1';
        }
    }

    int k, l;
    for(k = 0; k < size; k++){
        for(l = 0; l < size; l++){
            printf("%c", array[k][l]);
        }
        printf("\n");
    } 
}

(附带说明,kl 并不是真正需要的,您可以简单地重复使用 ij

【讨论】:

    猜你喜欢
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2016-01-18
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多