#26655: C語言,請問為何只有60分


e002933 (徐MAN)

學校 : 不指定學校
編號 : 158405
來源 : [111.71.113.217]
最後登入時間 :
2023-11-18 16:56:51
a022. 迴文 | From: [118.150.201.99] | 發表日期 : 2021-08-18 23:39

找不到錯誤

求助大家

我的想法:

jud是1時表示是迴文,預設為1

利用迴圈檢查,只要有任何一組不對就把jud變為0然後直接離開迴圈

#include <stdio.h>

#include <string.h>

int main()

{

char c[1000] = "0";

fgets(c, 1000, stdin);

int n = strlen(c);

int jud = 1;

for(int i = 0; i < n/2; i++) {

if(c[i] != c[n-2-i]) {

jud = 0;

break;

}

}

if(jud == 1)

printf("yes");

else if(jud == 0)

printf("no");

return 0;

}

 
#26657: Re:C語言,請問為何只有60分


linlincaleb@gmail.com (臨末之頌)

學校 : 新北市立板橋高級中學
編號 : 132772
來源 : [203.64.161.123]
最後登入時間 :
2024-07-29 10:02:49
a022. 迴文 | From: [36.226.244.73] | 發表日期 : 2021-08-19 10:12

如果輸入abab會有問題喔

if(c[i] != c[n-2-i])怪怪的

 
#26771: Re:C語言,請問為何只有60分


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a022. 迴文 | From: [110.28.135.31] | 發表日期 : 2021-08-24 17:04

找不到錯誤

求助大家

我的想法:

jud是1時表示是迴文,預設為1

利用迴圈檢查,只要有任何一組不對就把jud變為0然後直接離開迴圈

#include

#include

int main()

{

char c[1000] = "0";

fgets(c, 1000, stdin);

int n = strlen(c);

int jud = 1;

for(int i = 0; i < n/2; i++) {

if(c[i] != c[n-2-i]) {

jud = 0;

break;

}

}

if(jud == 1)

printf("yes");

else if(jud == 0)

printf("no");

return 0;

}


問題來自於fgets。你在測試的時候,應該是輸入字串後按enter,fgets讀取後,最後面會產生換行符號,因此strlen(c)的長度會比真正的長度大1。而在zerojudge的測資中,最後面沒有換行符號,所以c[n-2-i]會跟你想像的不太一樣。

我的建議是不要用fgets,可以改用scanf之類的就不會有這種問題。

你有興趣的話,可以建立文字檔,檔案內容是一組測資,注意最後面不要輸入換行,然後執行程式時使用重導向,看看字串長度是否不一樣:

執行檔 < 測資檔案
 
#26791: Re:C語言,請問為何只有60分


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [39.9.74.255]
最後登入時間 :
2024-10-14 22:20:08
a022. 迴文 | From: [110.28.135.31] | 發表日期 : 2021-08-25 08:38

找不到錯誤

求助大家

我的想法:

jud是1時表示是迴文,預設為1

利用迴圈檢查,只要有任何一組不對就把jud變為0然後直接離開迴圈

#include

#include

int main()

{

char c[1000] = "0";

fgets(c, 1000, stdin);

int n = strlen(c);

int jud = 1;

for(int i = 0; i < n/2; i++) {

if(c[i] != c[n-2-i]) {

jud = 0;

break;

}

}

if(jud == 1)

printf("yes");

else if(jud == 0)

printf("no");

return 0;

}


問題來自於fgets。你在測試的時候,應該是輸入字串後按enter,fgets讀取後,最後面會產生換行符號,因此strlen(c)的長度會比真正的長度大1。而在zerojudge的測資中,最後面沒有換行符號,所以c[n-2-i]會跟你想像的不太一樣。

我的建議是不要用fgets,可以改用scanf之類的就不會有這種問題。

你有興趣的話,可以建立文字檔,檔案內容是一組測資,注意最後面不要輸入換行,然後執行程式時使用重導向,看看字串長度是否不一樣:

執行檔 < 測資檔案

後來我發現很多網友都不推scanf...

如果你是因此用fgets的話,你可以先把後面的換行符號去掉

 
ZeroJudge Forum