2017-01-31 13 views
1

그래서 이것은 우리가이 일을 사용합니까 이유를 말해 줄 수 대문자, 소문자로 변환하는 데 사용한 프로그램입니다?를의 [(I]> = 97 개 & & STR [I] < = 122 STR의 [)] 다음 코드 섹션? 122 z 동안소문자를 대문자로 변환하는 프로그래밍 코드에서 왜 (str [i]> 97 && str [i] <= 122)를 사용합니까?

#include <iostream.h> 
#include <conio.h> 
#include <string.h> 
void main() 
{ 
    clrscr(); 
    char str[20]; 
    int i; 
    cout << "Enter the String (Enter First Name) : "; 
    cin >> str; 
    for (i = 0; i <= strlen(str); i++) { 
     if (str[i] >= 97 && str[i] <= 122) //Why do we use this??? 
     { 
      str[i] = str[i] - 32; 
     } 
    } 
    cout << "\nThe String in Uppercase = " << str; 
    getch(); 
} 
+3

[ASCII 테이블] (http://en.cppreference.com/w/cpp/language/ascii)이 도움이 될 수 있습니다. –

+0

97은''a''의 ASCII 코드이고, 122는''z''의 ASCII 코드입니다. 그 (와) 사이의 모든 문자는 일반적으로 "소문자"로 알려져 있습니다? – axiac

+9

그리고이 프로그램에서 끔찍한 것을 배우지 마십시오. 그것은 피해야하는 [* 마법 번호 *] (https://en.wikipedia.org/wiki/Magic_number_ (프로그래밍))를 사용합니다. 완벽하게 훌륭한 ['std :: toupper'] (http : // en.cppreference.com/w/cpp/string/byte/toupper) 기능을 사용하십시오. ASCII 인코딩을 사용하기 때문에 이식 할 수 없습니다. 그리고 그것은 ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string)을 사용하지 않으며 버퍼 오버 플로우가 발생하기 쉽습니다. –

답변

3

97, ASCII 문자 a의 진수 표현이다.

문자 (이 경우 단순히 바이트)가이 간격 안에 있으면 소문자입니다. 32를 Substracting하면 대문자가됩니다.

이 경우, str[i] <= 122 또는 str[i] <= 'z'을 쓰는 것은 같습니다.

ascii table

+0

@axiac : 마지막으로 확인한 날짜는 언제입니까? 그들은 그것을 바꿨을지도 모른다. –

+0

아, 어리석은 실수, 고마워. – Derlin

+0

@BenjaminLindley 분 전 :-) – axiac

1

는 그 ASCII에서 소문자 문자의 범위이기 때문에.

7

은 코드의이 부분은 매우 심하게 기록 : 더 나은 여전히 ​​

if(str[i]>='a' && str[i]<='z') 
{ 
str[i]=str[i]-'a'+'A'; 
} 

또는 표준 C 라이브러리 매크로/함수를 사용 :

if(str[i]>=97 && str[i]<=122) 
{ 
str[i]=str[i]-32; 
} 

으로 더 많은 휴대용 및 더 읽을 것 (<ctype.h>에서) :

if(islower(str[i])) 
{ 
str[i]=toupper((unsigned char)str[i]); 
} 
또는 더 나은 아직, 당신은 일을 건너 뛸 수 있습니다

완전히 전자 테스트 및 쓰기 :

str[i]=toupper((unsigned char)str[i]); 

(가 소문자가 아니라면 toupper 이후 변경되지 않은 문자를 반환합니다).

+1

'str [i] = toupper ((unsigned char) str [i])'라고 간단하게 말하면됩니다. –

+0

@JohnZwinck : 예, 고맙습니다. 아직 답변을 수정하고 있습니다 ... ;-) –

+0

"물론 읽을 수 있습니다". "a"에서 "z"까지 연속적인 숫자 표현을 가지고 있다는 보장이 없으므로 "훨씬 더 이식성이 뛰어나다" –

2

이 더 적절한 코드가 될 것이다 :

if(str[i]>='a' && str[i]<='z') 
{ 
str[i]=str[i] + 'A' - 'a'; 
} 
} 

없음 번호, 편지 소문자 'A'와 소문자 'Z'사이에 있다면, 그것은 'A'사이의 차이 '는에 의해 전치됩니다 ', 그리고 대문자 버젼이되었습니다.

2

소문자의 숫자가 97-122 인 ASCII에만 해당됩니다. 이것은 상수 문자 (65-90에서 매핑 됨)가 상수 감산 또는 비트 연산 (그리고 그 반대)으로 소문자로 변환 될 수 있다는 유용한 특성을 가지고 있습니다.

그러나 일반적으로 모든 시스템이 ASCII를 사용한다고 가정하는 것은 좋지 않습니다. 거기에 다른 문자 세트가 있습니다. <cctype> 헤더의 라이브러리 함수 touppertolower을 사용해야합니다.