2

こんにちは私はここで新しく、Cでプログラミングしています。簡単だと思われることは聞きたくありませんでしたが、クラスメートやプログラミングの先生に、エラーを見つけることができるかどうかを尋ねましたが、今日まで彼らは見つけることができませんでした。それ(それら)。

しかし、最初に私が知っていることを説明させてください、それは言います:

「ランタイムチェックの失敗#2-スタック変数「d」(場合によってはmおよびその他のy)が破損しました」。

私はそれをデバッグしようと仕事をしましたが、問題は常に(本体の)最後のコードラインに表示されるため、問題がどこにあるのか正確に見つけることができませんでした。ここにコードを添付します。あなたは問題を見つけて、私がそれを得る理由を私に説明します(将来同じ間違いを繰り返さないために)=D。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Type Declaration */
#define true 1
#define false 0
typedef char boolean;

/* Functions declaration */

boolean test( short int d, short int m, long int y );
boolean nextday( short int d, short int m , long int y );

int main( void )
{
    /* Variables initialization */
    short int d = 0, m = 0; 
    long int y = 0;

    do {
        /* Data by user*/
        printf( "Ingrese el numero de año: " );
        scanf( "%ld", &y );
    }   while ( y < 0 );

    do {
        printf( "Ingrese el numero de mes: " );
        scanf( "%d", &m );  
    }   while ( m < 1 || m > 12 );

    do {
        printf( "Ingrese el numero de dia: " );
        scanf( "%d", &d );
    }   while ( d < 01 || ( test( d, m, y ) == false ) ); // If the data is wrong then re-type the data


    // If the nextday function return value is true then the next day is 01, if not just sum a day
    if ( nextday ( d, m, y ) == true ) { 
        d = 01;

        // If we start a new year the new month must be 01-01-01.
        if ( m == 12 ) {
            m = 01;
            y++;
        }

        // Just increase the month for any other month
        else {
            m++;
        }
    }

    else {
        d++;
    }

    printf( "Mañana será: %d-%d-%ld\n", d, m, y );

    return 0;
}

boolean test( short int d, short int m, long int y ){
    int max;

    switch(m) {
        case 1:       
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            max = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            max = 30;
            break;
        case 2:
            if ( y % 400 == 0 ){
                max = 29;
            }
            else if ( y % 100 == 0 ){
                max = 28;
            }
            else if ( y % 4 == 0 ){
                max = 29;
            }
            else {
                max = 28;
            }
            break;
    }
    if ( d <= max ){
        return true;
    }
    else {
        return false;
    }
}

boolean nextday( short int d, short int m, long int y ) {

    boolean x;

    // If it's 28-02 in a secular year * 4 then it's a leap-year. (so it has 29 days)
    if  ( m == 2 && d == 28 && y % 400 == 0 ) {
        x = false;
    }

    // If it is an end of century but it isn't 4 multiply then it only has 28 days.
    else if ( m == 2 && d == 28 && y % 100 == 0 ) { 
        x = true;
    }

    // If it just a leap year it has 29 days.
    else if ( m == 2 && d == 28 && y % 4 == 0 ) { 
        x = false;
    }

    //If it's the last day of February and it's a leap year.
    else if ( m == 2 && d == 29 && y % 4 == 0 ){
        x = true;
    }

    // If we are in the end of the month.
    else if ( ( d == 30 && ( m == 4 || m == 6 || m == 9 || m == 11 ) ) || 
                d == 31 ) {  
        x = true;
    }

    // Then if it is another day just sum a day
    else {
        x = false;
    }

    return x;
}
4

2 に答える 2

5

以下を使用する必要があります。

scanf( "%hd", &m );
scanf( "%hd", &d );

それらは短いintであるためです。

「%d」を使用すると、基本的にストレージスペースintにサイズ変数をロードしています。small int

Anintは通常 4 バイトsmall intですが、2 バイトです。

于 2012-09-21T19:59:17.700 に答える
2
scanf( "%d", &m );  

%d「この引数は を指している」ことを意味しintます。へのポインタを提供していますshort int%hd( for ) を使用するshort intか、できれmば typeに変更しますint(ここでわざわざする必要はshort intありません)。

于 2012-09-21T20:00:16.733 に答える