2016-09-16 17 views
0

나는 책에서 주어진 문제에 갇혀있다. 문제는 -프로그램에서 예상치 못한 결과가 나타나는 이유는 무엇입니까?

원형 적 인터넷 초보자 messages.Here의 전형적인 B1FF의 성명서 :

H3Y DUD3, C (15) R1LLY C00L

쓰기 wriring의 독특한 방법을 가지고 동료 이름 B1FF입니다

하는 메시지를 입력 : 이봐 친구가, C는 rilly B1FF 발언에서 멋진
입니다 : H3Y DUD3, C (15) R1LLY C00L

사용자가 입력 한 메시지를 읽고 B1FF 발언으로 변환하는 "B1FF 필터" 프로그램에서 messa를 변환해야합니다. (A = 4, B = 8, E = 3, I = 1, O = 0, S = 5)를 대문자로 대문자로 대체하십시오. - 프로그램 IMAGE



내 프로그램 -

#include<stdio.h> 
    int main() 
    { 
     char arr[50]={0},ch[50]={0}; 
     int i=0; 
     printf("\nenter the sentence : "); 

     while(arr[i-1]!='\n') 
     { 
     scanf("%c",&arr[i]); 
     i++; 
     } 

     i=0; 

     while(arr[i]!='\n') 
     { 
     if(arr[i]=='e') 
     ch[i]='3'; 
     if(arr[i]==('A'||'a')) 
     ch[i]='4'; 
     if(arr[i]==('B'||'b')) 
     ch[i]='8'; 
     if(arr[i]==('I'||'i')) 
     ch[i]='1'; 
     if(arr[i]==('o'||'O')) 
     ch[i]='0'; 
     if(arr[i]==('S'||'s')) 
     ch[i]='5'; 

     else ch[i]=arr[i]-32; 
     i++; 

    } 

    ch[i]='\n'; 
    i=0; 
    printf("\nIn B1FF-SPEAK : "); 

    while(ch[i]!='\n') 
    { 
    printf("%c",ch[i]); 
    i++; 
    } 

    printf("\n"); 
    return 0; 
} 


OUTPUT 나는 프로그램이 알파벳을 변환하지 않는 이유를 이해하지 않고 왜 scanf()가 아닌지 문자로 space을 수락 하시겠습니까?

+0

워크. i의 값에주의를 기울이십시오. 특히 줄에서 하나를 빼고 배열 색인으로 사용하는 줄에 특히주의하십시오! –

+1

왜 'scanf'를 사용하여 단일 문자를 읽으십니까? 알다시피, 그것은 전체 문자열을 읽을 수 있습니다, 그렇죠? 또한'man scanf'를 읽어서 공백으로 무엇을하는지 이해하십시오. –

+0

if 문에서 논리적 실수를 볼 수 있도록 코드를 올바르게 들여 쓰기하십시오. –

답변

5

가장 먼저, 당신은 체인

if(arr[i]==('A'||'a')) 

같은 논리 OR 연산자 수없는이는 항상 TRUE 상태로 확인 때문에, 을 기대하고있어 것을 얻을. 당신은

말했다
if ((arr[i]=='A') || (arr[i] =='a')) 

,

  • ch[i]=='8';

    , ch[i]==1;는 기본적으로 문입니다 사용해야

    [('A'||'a')는 TRUE로 평가]. 비교 결과를 비교하고 폐기합니다. 과제를 원하면 =을 사용해야합니다.

    else ch[i]=arr[i]-32;
  • 이전 if 문, 아니 전체 if체인와 결합한다. 해당 부분을 처리하기 위해 switch 경우 또는 if-else if-else 구조를 사용할 수 있습니다.

  • 당신은 공백을 별도로 처리하지 않았습니다.


때문에 위의 두 번째 지점으로, 정교하게하려면, 코드는 기본적으로 대문자로 소문자로 변환하는 가난한 시도가 그냥

while(arr[i]!='\n') 
    { 
    if(arr[i]==('S'||'s')) //always false 
    ch[i]='5'; 

    else ch[i]=arr[i]-32; //always TRUE 
    i++; 
} 

을 줄일 수 있습니다. 비 알파 입력이 문자열에있는 경우 코드가 폭발합니다.

은 문자로

이유 scanf()가 수락하지 않는 공간에 대해 말했다?

부분은 scanf()은 완벽하게 당신이 단지 ASCII value of decimal 32있는 space에서 32을 뺀 맹목적으로에 의해 그것을 더 NUL (null를) 변환하지의, %c에 입력으로 공간을 받아들입니다. A NUL은 인쇄 할 수 없으므로 출력에 나타나지 않습니다.

+2

이 코드에는 많은 문제 중 하나이지만 사실입니다. –

+0

답을 고맙습니다. 제 코드가 잘못되었지만 적어도 "e"는 "3"으로 변환되어야합니다. 변환되지 않는 이유는 무엇입니까? – user239887

+0

실수로 작성된 @sourav oops입니다. 편집했지만 다시 동일한 결과가 나타납니다. – user239887

1

몇 가지 권장 사항 :

  • scanf("%c"...) 거의 전화를 많이 사용하지 마십시오. fgets() (manpage)을 사용하십시오. fgets은 입력에서 전체 라인을 읽고, 버퍼 (줄 바꿈 포함)에 저장하고, 그 끝에 문자열 끝에 '\ 0'을 둡니다.

  • toupper() (manpage)을 사용하십시오. 임의의 문자를 입력으로 사용합니다. 입력이 소문자이면 출력은 해당 문자의 대문자 버전입니다. 그렇지 않은 경우 출력은 입력과 같습니다.

  • 어레이를 제자리에서 업데이트하십시오. 배열 두 개가 필요하지 않습니다. 배열을 fgets()으로 읽은 다음 번역 논리로 루프를 돌리고 각 문자를 업데이트 한 다음 배열을 fputs()으로 작성합니다.

  • switch 문에 대해 자세히 알아보십시오. switch 문을 사용하면 코드를 더 간단하고 쉽게 읽을 수 있습니다. 모든 문자 -> 숫자 변환에 대해 하나의 대소 문자가 필요하며 다른 모든 것에 대해서는 대소 문자가 필요합니다. 디버거와 그것을 통해

    c = toUpper(c); 
    switch (c) { 
        case 'A': c = '4'; break; 
        case 'B': c = '8'; break; 
        .... 
        default: break; 
    } 
    
관련 문제