2014-09-14 4 views
1

나는 암호화 된 단어에 대해 다음과 같은 C 코드를 만들었습니다. (시저 암호)이 명령을 실행하면 끝 부분에 U가 항상 인쇄됩니다. 실행하면 실행하게됩니다.이 프로그램이 항상 끝에 U를 표시하는 이유

#include<stdio.h> 

int main(void){ 
    int x; 
    char en[100]; 

    fgets(en,100,stdin); 
    for(x=0;x<100;x++){ 
     if(en[x]=='\0'){ 
      break; 
     } 
     en[x]=((en[x]-71-3)%26)+97; 
    } 
    printf("%s\n",en); 
} 
+0

디버거를 사용하여 찾으십시오. –

답변

6

fgets은 버퍼 끝에 '\ n'앞에 '\ n'문자를 넣습니다. 당신이 그것을 암호화하지 않으 그렇다면, 루프 아래의 조건이 충족 될 때까지 :

if (en[x] == '\0' || en[x] == '\n') break; 

엄격한하기 위해, 당신은 U을 받고 왜 실제 이유는 \n는 ASCII 코드 (10)를 가지고 있다는 사실에 기인한다 따라서 (10-74)%26 + 97 = 85U의 ASCII 코드입니다.

+4

루프가'x <99' 인 동안 문자열이 그보다 짧으면 도움이되지 않습니다. – interjay

+0

그래, 나는 그 점을 놓쳤다. 수정 됨. 감사. – Claudix

+0

ohhhhh 대단히 감사합니다. 나는 6 시간 동안이 문제로 고통 받고있다. 나는 다른 qs.i가 fgets 장소 '\ 0'을 scanf와 같은 끝에 생각했다. 왜 그것이 틀렸는가? – 117788

0
if (en[x] == '\0' || en[x] == '\n') break; 

위의 상태로 문제가 해결됩니다. 일부 \ 0 \ n을위한 독서는 그가 단계 방법

trial

*rial 
rial 
q(ial 
qial 
qoal 
qoal 
qofl 
qofl 
qofx" 
qofx 
qofxi? 
qofxi? 
qofxiU 
를 한 단계에 대한 자세한 통찰력을주는 "흔적"실행의 출력은 다음 link

에 제시되어있다

+0

나는 fgets가 '\ 0'을 scanf.why와 같이 마지막에 잘못했다고 생각합니까? – 117788

+0

'fgets'는 사용자가 을 입력 할 때까지 버퍼에 값을 넣습니다. 예를 들어'stdin'에'trial'을 입력하면 fgets() 중에 반환되는 enter를 누르면'scanf() '그렇게하지 않습니다. 당신은이 [링크]에서 더 많은 아이디어를 얻을 수 있습니다 (http://stackoverflow.com/questions/14033477/why-is-the-first-string-ignored-when-reading-with-fgets-from-stdin?rq=1)뿐만 아니라 – akrv

관련 문제