2017-03-13 1 views
0

온라인 솔루션을 검색하려고 시도했지만 찾을 수 없습니다. 내가 온 옷장은char와 int의 합계가 내 C++ 코드에서 이상한 문자로 연결됩니다.

int main() 
{ 
char a[1000000],s[100000]; 
scanf("%s",s); 
int i,l=strlen(s); 


    //cout<<l; 
for(int i=0;i<l;i++) 
    a[i]=s[l-i-1]; //to reverse the word in s[] 

    cout<<a<<endl; 
for(i=0;i<l;i++) 
    { 
     s[i]+=a[i]-96; 
     if(s[i]>'z') 
     { 

      int diff=s[i]-'z'; 
      s[i]='a'+(diff-1); 

     } 
    }  
    cout<<s; 

return 0; 
} 

//l=length of string. 
//a[i]=is another string with word in s[] being reversed. 

내 문제는 내가 이것을 실행하고 입력을 줄 때, 말, world이 일부 이상한 문자를 인쇄한다는 것입니다 .... 다음은이 A similar unanswered question on cplusplus.com

내 코드입니다. 내가 적용한 논리에 어떤 결함도 보이지 않아서 나는 지금 좌절감을 느낍니다. 질문은 질문

는 내가 다른 하나의 버전을 반전 중 하나는 두 개의 문자열을 추가하기로 오전이고 또한 그런 방법이 'a' + 'b' = 'c', 'd' + 'a' = 'e' .... 그리고 'z' + 'a' = 'a'에서 수행하는 것입니다. 그래서 추가는 작은 알파벳 아래 닫힙니다.

+0

C++에서 특정 * 인코딩 *을 사용하는 것은 좋지 않습니다. 그러면 코드가 이식 가능하지 않기 때문입니다. 다시 엔지니어를 제안하고 버그가 사라 졌으면 좋겠습니까? – Bathsheba

+0

문자의 ASCII 숫자를 검색 할 수 있습니다. – camelccc

+0

특정 코드 및 이식 가능 코드가 아니라 무엇을 의미합니까? 좀 더 설명해 주시겠습니까? –

답변

1

문제는 서명 된 char (부호있는 바이트)을 사용하고 있다는 것입니다. 서명 된 char이 127 이상이되면 음수를 반전시킵니다. 이로 인해 계산 값이 범위를 벗어났다는 사실을 놓치게되고 인쇄 될 때 다시 높은 문자로 변환됩니다.

while ((unsigned char)s[i] > 'z') 
    { 
     s[i] -= 26; 
    } 

를 다음 프로그램은 적어도 당신이 그것을 어떻게 원하는 것을 수행합니다

당신은 단순히이 확인 주위에 랩을 대체 할 수 있습니다. 의견을보다 강력하게 만들어 준 의견에 대해서는 좋은 제안이 있습니다.

+0

고맙습니다. 지금 해결되었습니다! –

+0

A와 Z 사이에 알파벳 26자를 가정합니다. 하루가 바뀌면 어떻게 될까요? 또한,'char '='z '+'z ''가 UB인데'char'가 8 비트이고'z' 코드가 122이면 중간 계산에'int'를 사용하십시오. –

+0

ASCII 'z'가 어떻게 든 값을 변경하더라도 값이 여전히 128 미만이라고 가정 할 수 있으며 라틴 알파벳에 대한 연속적인 코드 블록이 있으므로 위의 코드는 모든 'z'값 (127 + 127 <256 그래서 우리의 알파벳이 26 글자를 계속 가지고있는 한 주위를 감싸지 않습니다). 기본적으로 영원한 것을 의미합니다. –