#9996: 為何錯 求解


ianrush (ianrush)

學校 : 國立成功大學
編號 : 50503
來源 : [140.116.187.240]
最後登入時間 :
2016-09-29 17:57:26
b428. 凱薩加密 | From: [140.116.187.240] | 發表日期 : 2015-07-06 14:50

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <cstring>
  5 using namespace std;
  6 int main()
  7 {
  8    char inputA[1000];
  9    char inputB[1000];
 10    while(cin.getline(inputA, 1000))
 11    {
 12       cin.getline(inputB, 1000);
 13       if(strlen(inputA) != strlen(inputB))
 14          break;
 15       int a = int(inputB[0]) - int(inputA[0]);
 16       if(a >= 0)
 17          cout << a << endl;
 18       else
 19          cout << 26-abs(a) << endl;
 20    }
 21    return 0;
 22 }

 
#9998: Re:為何錯 求解


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
b428. 凱薩加密 | From: [114.34.29.100] | 發表日期 : 2015-07-06 15:03

非常抱歉,題目描述有問題。

已經更正為長度小於等於 1000 大於 0 且只由大寫英文字母構成。

將您的代碼的 buffer 長度放寬即可通過,感謝回報。

 
#9999: Re:為何錯 求解


wemee (阿勇)

學校 : 國立北港高級中學
編號 : 4621
來源 : [220.135.3.103]
最後登入時間 :
2023-09-27 11:01:07
b428. 凱薩加密 | From: [60.250.139.121] | 發表日期 : 2015-07-06 15:09

非常抱歉,題目描述有問題。

已經更正為長度小於等於 1000 大於 0 且只由大寫英文字母構成。

將您的代碼的 buffer 長度放寬即可通過,感謝回報。

 



還是錯的

 

我如果送出

#include <stdio.h>

#define _SIZE_ 1000

int main() {

    char c1[_SIZE_], c2[_SIZE_];

    int ans;

    while(fgets(c1, _SIZE_, stdin)){

        fgets(c2, _SIZE_, stdin);

        ans = c2[0]-c1[0];

        printf("%d\n", ans >=  0 ? ans : ans+26);

    }

    return 0;

}

會在161行 WA

 ------------------

改成 

#include <stdio.h>

#define _SIZE_ 1024

int main() {

    char c1[_SIZE_], c2[_SIZE_];

    int ans;

    while(fgets(c1, _SIZE_, stdin)){

        fgets(c2, _SIZE_, stdin);

        ans = c2[0]-c1[0];

        printf("%d\n", ans >=  0 ? ans : ans+26);

    }

    return 0;

}

就AC,

難道char c1[1000]會裝不下剛好1000個字元嗎?(位置從0...999)

你的測資長度至少1001

 
#10000: Re:為何錯 求解


wemee (阿勇)

學校 : 國立北港高級中學
編號 : 4621
來源 : [220.135.3.103]
最後登入時間 :
2023-09-27 11:01:07
b428. 凱薩加密 | From: [60.250.139.121] | 發表日期 : 2015-07-06 15:11

非常抱歉,題目描述有問題。

已經更正為長度小於等於 1000 大於 0 且只由大寫英文字母構成。

將您的代碼的 buffer 長度放寬即可通過,感謝回報。

 



還是錯的

 

我如果送出

#include

#define _SIZE_ 1000

int main() {

    char c1[_SIZE_], c2[_SIZE_];

    int ans;

    while(fgets(c1, _SIZE_, stdin)){

        fgets(c2, _SIZE_, stdin);

        ans = c2[0]-c1[0];

        printf("%d\n", ans >=  0 ? ans : ans+26);

    }

    return 0;

}

會在161行 WA

 ------------------

改成 

#include

#define _SIZE_ 1024

int main() {

    char c1[_SIZE_], c2[_SIZE_];

    int ans;

    while(fgets(c1, _SIZE_, stdin)){

        fgets(c2, _SIZE_, stdin);

        ans = c2[0]-c1[0];

        printf("%d\n", ans >=  0 ? ans : ans+26);

    }

    return 0;

}

就AC,

難道char c1[1000]會裝不下剛好1000個字元嗎?(位置從0...999)

你的測資長度至少1001

 


抱歉,我搞清楚了,1000個字元以外,後面還有換行符號'\n'跟'\0'

 

所以字元陣列至少要1002 

 
#10001: Re:為何錯 求解


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
b428. 凱薩加密 | From: [114.34.23.164] | 發表日期 : 2015-07-06 15:13

沒錯,在 C/C++ 中,字元陣列的讀入會補上 '\0' 字元作為結束符號。

因此藉由函數一次讀入 n 個字元,則佔有記憶體空間為 n+1 個。

倘若採用單一字元的讀入方法,則不會有這個問題。

 
#10002: Re:為何錯 求解


morris1028 (碼畜)

學校 : 國立花蓮高級中學
編號 : 3529
來源 : [114.37.59.62]
最後登入時間 :
2021-07-12 19:00:43
b428. 凱薩加密 | From: [114.34.23.164] | 發表日期 : 2015-07-06 15:16

 

沒錯,在 C/C++ 中,字元陣列的讀入會補上 '\0' 字元作為結束符號。

因此藉由函數一次讀入 n 個字元,則佔有記憶體空間為 n+1 個。

倘若採用單一字元的讀入方法,則不會有這個問題。


補充一下,fgets 和 gets 函數在 '\n' 讀入是有差別的,前者會保留換行字元,後者不會。但前者有提供大小檢查來防止溢滿,後者沒有。

 

因此,使用 fgets 要宣告 1002 個以上,用 scanf 和 gets 宣告要 1001 個以上。


 
ZeroJudge Forum