簡體   English   中英

為什么 %d 在我的 c 程序 output 中顯示 0?

[英]Why %d is showing 0 in my c program output?

該程序是在所有輸入的整數中找到最大的數。 它要求用戶輸入一個數字 10 次或按 0 退出,以較早者為准。 但是,output 不如預期。 如果您能幫助新手,我將不勝感激。

#include <stdio.h>

int main()
{
    int num[10];
    int max, a;
    for (a = 0; a < 10; a++)
    {
        printf("Enter the integer: ");
        scanf("%d", &num[a]);
        if (num[a] == 0)
            break;
    }

    for(a = 0; a < 10; a++)
    { 
        num[0] = max;
        if(max < num[a])
        {
            num[a] = max;
        }
    }

    printf("This is the largest integer: %d", max); //The output is coming wrong here.

    return 0;
}
  1. 不要使用 num[0],你用未初始化的 max 變量覆蓋它,所以它是 0。
  2. 使用 max 到最小類型變量(INT_MIN 和 limits.h header 文件)或在捕獲輸入后將其初始化為 max = num[0]。
#include <limits.h>

  int max = INT_MIN;

此外,您還需要按如下方式更改第二個 for 循環,以便在迭代時更新 max 變量,而不是 num[] 變量。 如果您之前已經假設 max 是第一個元素,則循環變量從 1 開始,否則循環變量將從 0 開始。

  for(a = 1; a < 10; a++) // a=0 if max was initialized to INT_MIN above
  { 
    if(num[a]>max)
    {
     max = num[a];
    }
  }

您永遠不會分配max變量。

您要做的是檢查輸入的值是否大於您之前輸入的每個值,因此您需要使用以下條件:

if (num[a] > max)
    max = num[a];

您還需要將max初始化為某個值(比方說,如果您希望只有正整數,它可能是0 ,但請查看Jigsaw答案以獲得更好的解決方案): int max = 0; .
並最終添加一個if-condition來檢查max是否為0 ,這樣您就知道是否沒有輸入任何值:

if(max == 0)
    printf("No values have been entered.");

else printf("This is the largest integer: %d", max);

請注意,您可以在同一個 for 循環中分配num和 update max的元素,因此第二個 for 變得完全無用,您可以將其刪除:

#include <stdio.h>

int main()
{
    int num[10];
    int max = 0, a;
    for (a = 0; a < 10; a++)
    {
        printf("Enter the integer: ");
        scanf("%d", &num[a]);
        if (num[a] == 0)
            break;
        if (num[a] > max)
            max = num[a];
    }

    if(max == 0)
        printf("No values have been entered.");
    else printf("This is the largest integer: %d", max);

    return 0;
}

我建議你打開你的編譯器警告,尤其是-Wall-Wextra ,這樣你會注意到這樣的問題:

<source>: In function 'main':
<source>:17:16: warning: 'max' may be used uninitialized [-Wmaybe-uninitialized]
   17 |         num[0] = max;
      |         ~~~~~~~^~~~~
<source>:6:9: note: 'max' was declared here
    6 |     int max, a;
      |         ^~~

您既不初始化也不向變量max寫入任何值。 使用未初始化的變量是未定義的行為。

您似乎知道如何將 0 a . 但是對於max ,你似乎把它顛倒了。 請記住,with =右邊的值進入到左邊的變量中。

要解決此問題,請轉動任何something = max; 在您的代碼中出現max = something; .

對於初學者來說,這個 for 循環

for (a = 0; a < 10; a++)
{
    printf("Enter the integer: ");
    scanf("%d", &num[a]);
if (num[a] == 0)
    break;
}

由於條件,可以在數組num中輸入少於10元素

if (num[a] == 0)
    break;

所以下一個循環必須准確地遍歷數組a元素而不是10 因此,在下一個循環中,您必須為索引使用另一個變量,例如

for( int i = 0; i < a; i++)

變量max未初始化

int max, a;

因此,此 for 循環調用未定義的行為,其中變量max被分配給數組元素或與數組元素進行比較。

for(a = 0; a < 10; a++)
{ 
  num[0] = max;
  if(max < num[a])
  {
   num[a] = max;
  }
}

此外,變量max在 for 循環中沒有改變。 所以整個循環沒有意義。

注意用戶可以一次輸入0 因此該數組將不包含任何有效值。 在這種情況下,數組沒有最大值。

例如,您的程序可以通過以下方式查看

#include <stdio.h>

int main( void )
{
    enum { N = 10 };
    int num[N];

    int i = 0;

    do
    {
        printf( "Enter the integer (0 - stop): " );
        scanf( "%d", &num[i] );
    } while ( num[i] != 0 && ++i < N );

    int max_i = 0;

    for ( int j = 1; j < i; j++ )
    { 
        if ( num[max_i] < num[j] )
        {
            max_i = j;
        }
    }
  
    if ( i == 0 )
    {
        puts( "You have not entered numbers unequal to zero." );
    }
    else
    {
        printf("This is the largest integer: %d", num[max_i] );
    }

    return 0;
}

暫無
暫無

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

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