#33321: 答案跟dev c++不一樣??


sam179851@gmail.com (林鈺宸)

學校 : 不指定學校
編號 : 214206
來源 : [60.244.211.69]
最後登入時間 :
2023-08-30 15:01:53
a054. 電話客服中心 -- 板橋高中教學題 | From: [42.72.231.76] | 發表日期 : 2022-12-24 03:53

#include <stdio.h>
#include <iostream>
#include <string.h>
enum { A = 10, B = 11, C = 12, D = 13, E = 14, F = 15, G = 16, H = 17,
           I = 34, J = 18, K = 19, L = 20, M = 21, N = 22, O = 35, P = 23,
           Q = 24, R = 25, S = 26, T = 27, U = 28, V = 29, W = 32, X = 30,
           Y = 31, Z = 33
};
int main(){
    int remain,check;
    int place, b = 7;
    int total = 0, total_2 = 0;
    char num1[9];
    int value[26] = { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z };
    char eng[27]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    scanf("%s",num1);
    check = num1[8] - '0';
    for( int i = 1 ; i < 9 ; i++ ) {
        remain = num1[b] - '0';
        total = total + remain * i ;
        b--;
    }
    
    total_2 = total;
    
    for( int j = 0 ; j < 26 ; j++ ) {
        remain = value[j] % 10;
        value[j] = value[j] / 10;
        total_2 = total_2 + value[j] + remain * 9;
        place = 10 - ( total_2 % 10 );
        if( place == 10 )
            place = 0;
        if ( place == check )
            printf("%c", eng[j] );
        total_2 = total;
    }

}

 

卡測資12跟19,超級問號,為什麼AMW那個的A會印不出來?但明明我在DEV C++中可以._.,有人可以解釋一下嗎?

 

 
#33326: Re: 答案跟dev c++不一樣??


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a054. 電話客服中心 -- 板橋高中教學題 | From: [101.137.0.192] | 發表日期 : 2022-12-24 18:18


    char num1[9];

    scanf("%s",num1);

卡測資12跟19,超級問號,為什麼AMW那個的A會印不出來?但明明我在DEV C++中可以._.,有人可以解釋一下嗎?

 


你的num1開太小了,輸入9碼,加上最後的空字元長度需要10,結果就buffer overflow,溢出來的空字元剛好把eng[0]的'A'覆蓋掉了

(所以才會說用scanf %s輸入字串跟gets一樣不安全)

 
ZeroJudge Forum