我的以下程式自己編譯執行後都能跑出正確答案,但是放到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);
}
}
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?
我想到一種我覺得是偷吃步的方式,就是從stdio.h把fmemopen()的宣告複製到程式碼裡面,這樣子竟然就能AC了,好孩子不要學...