#9996: 為何錯 求解


ianrush (ianrush)


  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 (碼畜)


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

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

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

#9999: Re:為何錯 求解


wemee (阿勇)


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

已經更正為長度小於等於 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 (阿勇)


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

已經更正為長度小於等於 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 (碼畜)


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

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

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

#10002: Re:為何錯 求解


morris1028 (碼畜)


 

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

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

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


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

 

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