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

C 除非存在另一个Printf,否则Printf不起作用,c,C,我试图用C语言解决HackerRank上的一个挑战。有一个包含n行和n列的方阵。挑战在于将矩阵对角线的两个和之间的绝对差打印为单个整数 以下是链接: 我能够得到正确的答案,但是代码末尾的printf()语句不起作用,除非在for循环语句之前添加不必要的printf(“”)。 有人能解释为什么会这样吗 提前谢谢 代码如下: #include <math.h> #include <stdio.h> #include <string.h> #include <

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

以下是链接:

我能够得到正确的答案,但是代码末尾的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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
int n;
scanf(“%d”和“&n”);
int a[n][n],和d1=0,和d2=0,a_i,a_j;

对于(a_i=1;a_i,尾随的换行符是这里的关键。出于性能原因,标准输出仅在遇到行尾时刷新。如果更改为fprintf(stderr,…),则代码将按原样工作。您也可以使用fflush(stdout)在printf之后。

尾随的换行符是这里的关键。标准输出仅在遇到性能原因导致的行尾时才会刷新。如果更改为fprintf(stderr,…),则代码将按原样工作。您也可以使用fflush(stdout)在您的printf之后。

正如其他一些人所提到的,您的主要问题是数组声明/使用。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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int n;
scanf(“%d”和“&n”);
int a[n][n],和d1=0,和d2=0,a_i,a_j;
for(a_i=0;a_i
正如其他一些人所提到的,您的主要问题是数组声明/使用。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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
int n;
scanf(“%d”和“&n”);
int a[n][n],和d1=0,和d2=0,a_i,a_j;
for(a_i=0;a_i
您有未定义的行为,因为您正在位置
[n]对数组进行索引
。您还有一个缺少换行符的错误。请将
\n
添加到格式字符串的末尾以修复它。这样,行将正确结束,而不是在程序退出时悬空。@TomKarzes为什么在此之前会使用空字符串printf来修复此错误?您的主要错误是将数组视为从1..n索引。它们不是.有效索引从0运行…(n-1)。现在很少有语言使用基于一的索引。由于您访问的是数组边界之外的内容,因此会损坏一些内存。额外的
printf
调用会随机导致第二个
printf
工作。请修复您的错误。由于您在
[n]位置对数组进行索引,因此存在未定义的行为
。您还有一个缺少换行符的错误。请将
\n
添加到格式字符串的末尾以修复它。这样,行将正确结束,而不是在程序退出时悬空。@TomKarzes为什么在此之前会使用空字符串printf来修复此错误?您的主要错误是将数组视为从1..n索引。它们不是。有效索引从0运行…(n-1)。现在很少有语言使用基于一的索引。由于您在数组边界之外访问,因此会损坏一些内存。额外的
printf
调用会随机导致第二个
printf
工作。修复您的错误。