除非存在另一个printf,否则Printf不起作用

时间:2016-04-14 03:04:27

标签: c

我试图在HackerRank上解决C中的挑战。有一个有n行和列的方形矩阵。挑战在于将矩阵对角线的两个和之间的绝对差值打印为单个整数。

这是链接: https://www.hackerrank.com/challenges/diagonal-difference

我能够得到正确的答案,但代码末尾的printf()语句不起作用,除非我在for循环语句之前添加了不必要的printf(“”)。 有人可以解释为什么会这样吗?

提前致谢

以下是代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main()
{
    int n; 
    scanf("%d",&n);
    int a[n][n],sum_d1=0,sum_d2=0,a_i,a_j;
    for( a_i = 1; a_i <= n; a_i++)
    {
       for(a_j = 1; a_j <= n; a_j++)
       {
           scanf("%d",&a[a_i][a_j]);
           if(a_j==a_i)
               sum_d1=sum_d1+a[a_i][a_j];
       }
    }
    printf("");// the last printf works only when this statement is present
    for(a_i=1;a_i<=n;a_i++)
    {
        for(a_j=n;a_j>0;a_j--)
        {
            if((a_i+a_j)==(n+1))
                sum_d2=sum_d2+a[a_i][a_j];
        }
    }
    printf("%d",abs(sum_d1-sum_d2)); //this doesn't work if there is no printf above
    return 0;
}

2 个答案:

答案 0 :(得分:3)

尾随换行符是关键所在。标准输出仅在遇到因性能原因而结束的行时才刷新。如果您更改为fprintf(stderr,...),那么您的代码将按原样运行。你也可以在printf之后使用fflush(stdout)。

答案 1 :(得分:1)

正如其他几个人所提到的,你的主要问题是你的数组声明/使用。 C中的数组的第一个索引从0开始,而不是从1开始。因此,当您尝试将数据存储在数组中或再次访问它们时,它就不在数组的边界内,并且可能以无意的方式运行。

数组示例:数组[2] [3]

    0  1 
0  a|  b | 
1  c|  d | 
2  e|  f |

Array[0][0] == a 
Array[1][1] == d 
Array[1][2] == f

在你的代码中,如果某人输入“1”,则会创建一个大小为[1] [1]的数组 - 一个元素。这应该使用[0] [0]访问,但是代码正在被[1] [1]访问,这是一个无效元素,因为它不是数组的一部分。

如果不确切知道你的代码要做什么,我无法完全解决它,但一个好的开始如下:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>

int main(){
    int n; 
    scanf("%d",&n);
    int a[n][n],sum_d1=0,sum_d2=0,a_i,a_j;
    for( a_i = 0; a_i < n; a_i++){
       for(a_j = 0; a_j < n; a_j++){
           scanf("%d",&a[a_i][a_j]);
           if(a_j==a_i)
               sum_d1=sum_d1+a[a_i][a_j];
       }
    }
    //printf("");// the last printf works only when this statement is present
    for(a_i=0;a_i<n;a_i++)
    {
        for(a_j=n-1;a_j>=0;a_j--)
        {
            if((a_i+a_j)==(n+1))
                sum_d2=sum_d2+a[a_i][a_j];
        }
    }
    printf("%d",abs(sum_d1-sum_d2)); //this doesn't work if there is no printf above
    return 0;
}