簡體   English   中英

除非存在另一個printf,否則Printf不起作用

[英]Printf does not work unless another printf is present

我試圖解決HackerRank上C語言中的挑戰。 有一個具有n行和n列的正方形矩陣,難題是將矩陣對角線的兩個和之間的絕對差打印為單個整數。

這是鏈接: https : //www.hackerrank.com/challenges/diagonal-difference

我能夠得到正確的答案,但是除非在for循環語句之前添加不必要的printf(“”),否則代碼末尾的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;
}

尾隨換行符是這里的關鍵。 標准輸出僅在遇到由於性能原因而終止的行時才刷新。 如果更改為fprintf(stderr,...),則您的代碼將按原樣運行。 您也可以在printf之后使用fflush(stdout)。

正如其他幾個人提到的那樣,您的主要問題是數組聲明/使用。 C中的數組的第一個索引從0開始,而不是從1開始。因此,當您嘗試將事物存儲在數組中或再次訪問它們時,它超出了數組的邊界,並且可能以意外的方式起作用。

數組示例:Array [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]的數組-一個元素。 應該使用a [0] [0]來訪問它,但是在代碼中卻被a [1] [1]來訪問,a [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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM