#28379: 我的c語言程式一直RE


shnovaj30101@gmail.com (省澤吳)

學校 : 不指定學校
編號 : 126885
來源 : [1.164.250.79]
最後登入時間 :
2022-06-30 23:00:11
d392. 读取练习——强大的加法! -- liouzhou_101 | From: [114.39.231.165] | 發表日期 : 2021-12-05 23:19

我的以下程式自己編譯執行後都能跑出正確答案,但是放到judge就一直跑RE,就連測試測資也RE跑不過,主要是"while(fscanf(fp, "%ld", &b) != EOF) {" 那一行RE,想丟上來問問大家是否我有地方理解錯誤。

 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

int main(void) {

    char a[10010];

 

    while(fgets(a, 10000, stdin) != NULL) {

        FILE *fp;

        fp = fmemopen(a, strlen(a), "r");

        long int b, int_sum = 0;

 

        while(fscanf(fp, "%ld", &b) != EOF) {

            int_sum += b;

        }

        printf("%ld\n", int_sum);

    }

}

 
#28389: Re:我的c語言程式一直RE


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
d392. 读取练习——强大的加法! -- liouzhou_101 | From: [39.9.68.65] | 發表日期 : 2021-12-06 21:02

https://zerojudge.tw/UserGuide.html#compiler

因為zerojudge編譯會加上-std=c11,所以像是fmemopen()這種不標準的東西會變成沒有宣告,所以會出現錯誤。

編譯時會出現以下警告訊息:

$ gcc -o out -std=c11 main.c
main.c: 在函式 「main」 中:
main.c:10:14: 警告:implicit declaration of function 「fmemopen」; did you mean 「freopen」? [-Wimplicit-function-declaration]
   10 |         fp = fmemopen(a, strlen(a), "r");
      |              ^~~~~~~~
      |              freopen
main.c:10:12: 警告:assignment to 「FILE *」 from 「int」 makes pointer from integer without a cast [-Wint-conversion]
   10 |         fp = fmemopen(a, strlen(a), "r");
      |            ^

所以你要用別的方式來寫,不能用fmemopen,或許可以用strtok?

 
#28390: Re:我的c語言程式一直RE


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
d392. 读取练习——强大的加法! -- liouzhou_101 | From: [39.9.68.65] | 發表日期 : 2021-12-06 21:06

我想到一種我覺得是偷吃步的方式,就是從stdio.h把fmemopen()的宣告複製到程式碼裡面,這樣子竟然就能AC了,好孩子不要學...

 
ZeroJudge Forum