2011-10-03 3 views
0

대문자를 소문자로 변경하면 문자열의 길이를 줄일 수 있습니까?대문자를 소문자로 변경하면 문자열의 길이를 줄일 수 있습니까?

void lower(char *s) 
{ 
    int i; 
    for (i=0;i<strlen(s);i++) 
    if(s[i])>='A' && s[i]<='Z') 
     s[i]-=('A'-'a'); 
} 
+0

무엇이 문제입니까? 문자열을 소문자로 변경할 때 일반 * (인코딩 및 가능한 로케일에 따라 다를 수 있음) 또는 특정 코드 조각이 문자열의 길이를 변경하는지 여부를 결정할 수 있습니까? – jalf

+0

대신 std :: tolower를 사용해야합니다. 코드를 사용하면 코드가 변경되지 않으므로 길이를 변경하지 않아도됩니다. – sehe

+0

C++을 사용하는 경우에는'std :: string','tolower' 등을 사용하고 더 높은 코드로 이동해야합니다 추상화 수준. –

답변

1

한 문자를 다른 문자로 바꾸면 결과 문자열의 크기가 그대로 유지됩니다. 유형 char은 항상 C 또는 C++에서 1 바이트로 정의됩니다.

2

아니요.

일부 다른 것들

가 참고 :

    당신은 루프의 각 반복에 strlen을 계산하고
  1. , 당신은 문자열을 가정 변수
  2. 에 저장하는 것은 제대로 null이 종료입니다 시도; 그렇지 않으면 오버런 할 것입니다.
+0

누락 된 누락에 대해이 루프를 안정화 시키려면 어떻게 제안 하시겠습니까? 죄송합니다.이 말은 바보 같지만 실제로는 보이지 않습니다. – thiton

+0

내가 생각할 수있는 유일한 안전한 방법은 API ('lower (char * s, size_t maxlen)')를 변경하는 것입니다. 이렇게하면 주변 코드가 유사한 바운드 문자열 함수 (예 : 'strcpy' 대신'strncpy'를 사용하십시오. 이 가정이 없다면 나는 어떤 방법도 보지 못한다. – orip

+0

1. 컴파일러가 최적화를 처리하도록하십시오. –

2

ASCII로 작업하고 있으므로 분명히 일대일 교체를 수행하고있는 것입니다. UTF-8을 지원하도록 코드를 변경해야합니까?

-1

이 코드 은 문자열의 길이을 변경하지 않습니다. 그러나 코드가 인 문제가 있습니다. 중복되는 모든 반복마다 strlen()을 계산하십시오. 변수에 결과를 저장하고 루프에 사용하십시오.

+0

두 번째 요점이 잘못되었습니다. –

+0

@DavidHeffernan, 나는 엉망이되었습니다. 지금 편집되었습니다. – iammilind

0

문자열이 대소 문자를 변경하면 길이가 바뀔 수 있습니다. 예를 들어, 독일어의 경우 두 문자 문자열 "SS"는 이 특정 문맥에서 "ß"라는 단일 문자 문자열이됩니다 (단, 이외의 문자 : "STRASSE"-> "Straße"이지만 "GASSE"-> "Gasse"). 대소 문자를 올바르게 바꾸는 일은 분명히 중요하지 않으며 매우 로케일 과 같은 것입니다. 표준에 대한 실질적인 지원은 없습니다.

코드는 길이를 변경하지 않습니다 게시,하지만, 제대로 에서 멀리이다 :, 인코딩에 따라, 그것은 (알파벳은 항상 연속되지 않습니다)뿐만 아니라 어떤 알파벳이 아닌 문자를 변경할 수 있으며, 확실히 일부 알파벳 문자를 변환하지 못합니다. 'Ä', 'Ö'및 스웨덴어로 'Ü'입니다.

관련 문제