[英]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.