왜틀렸을까요? 비쥬얼스튜디오에서는 되는데 ㅜㅜ

jheee Reply 9 years 30 weeks ago
#include <stdio.h> #include<string.h> #include<math.h> int main() { int diu,a,b,i,m,k,t,r=0; char s1[1000]={0}; scanf("%d",&b); fflush(stdin); for(k=1;k<=b;++k) { gets(s1); for(i=0; i<strlen(s1); ++i) { if(('0'<=s1[i]&&s1[i]<='9')||('A'<=s1[i]&&s1[i]<='F')||('a'<=s1[i]&&s1[i]<='f')||(s1[i]=='x'||s1[i]=='X')) m=1; //0~9,A~F,a~f,x,X인 경우 m=1 else { m=0; break; } } if(m==1) { if((s1[0]=='0')&&(s1[1]=='x'||s1[1]=='X')) { //0X의 형식을 만족하는지 판단 for(t=2;t<strlen(s1);t++) { double l=strlen(s1)-t-1; double z=pow(16,l); int w=(int)z; if('0'<=s1[t]&&s1[t]<='9') r+=w*(s1[t]-'0'); else if('A'<=s1[t]&&s1[t]<='F') r+=w*(s1[t]-'A'+10); else if('a'<=s1[t]&&s1[t]<='f') r+=w*(s1[t]-'a'+10); else { printf("null"); break; } } if(s1[t]!='x' &&s1[t]!='X') printf("%d",r); r=0; } else printf("null"); } else if(m==0) { printf("null"); } fflush(stdin); printf("\n"); } return 0; }
pichulia Reply 9 years 30 weeks ago
fflush가 원인입니다. fflush는 이런 문제푸는 사이트에게는 백해무익한 함수이니까 당장 지우세요. 당장. 제발.
jheee Reply 9 years 30 weeks ago
왜인지알수있을까요?? 저함수를 지우면 gets가 받는값이 달라지지않나요..?
booksky Reply 9 years 30 weeks ago
fflush는 뒤에 들어오는 입력값을 전부 버리는 함수입니다. 사용자가 직접 입력하는 환경에서는 아무 문제 없이 돌아가지만 컴퓨터가 입력하는 환경에서는 입력값을 한번에 입력하게 되고. 그럴 경우 fflush뒤에 들어오는 입력값이 전부 버려집니다. 그냥 scanf등을 사용해서 값 하나를 덤핑하는게 좋습니다.
jheee Reply 9 years 30 weeks ago
저걸지우면.. 뒤에있는값이 gets에들어가는게 아닌가요..? 아니면gets가 뒤에있는값을 모시하고 다음라인을받게되는 건가요??
booksky Reply 9 years 30 weeks ago
확실치는 않지만 아마 ₩n하나만 들어가는 문자열이 gets에 들어갈 것입니다. 그러니 fflush말고 getchar나 scanf("%c")등을 통하여 ₩n을 무시시키면 되는겁니다
jheee Reply 9 years 30 weeks ago
감사합니다!!:D