2011-08-30 5 views
2

'abcd 汉字 efg'가 포함 된 문자열을 역순으로 변환하는 방법에 대한 문제가 있습니다.ASCII 문자와 비 ASCII 문자를 포함하는 문자열 반전

str_to_reverse = "abcd汉字efg"; /* those non-ASCII chars are Chinese characters, each of them takes 2 bytes */ 

복귀 후, 그것이 있어야 : 나는 단순히 모든 바이트를 반대하는 것은하지 것이라고 생각하기 때문에

str_toreverse = "gfe字汉dcba"; 

생각이 문자열을 반대로, 나는 그 비 ASCII 문자를 식별 해 정답.

어떻게하면됩니까?

추신 : 이 프로그램은 32 비트 우분투에서 작성했습니다.

for(i = 0; i < strlen(s); i++) 
    printf("%c", s[i]); 

내가 대신 "汉字"일부 횡설수설 텍스트를 가지고 : 다음 나는 모든 바이트를 출력한다.

+0

당신은 비 ASCII 문자를 식별 할 필요가 없습니다, 문자열 중 하나를 16 개 비트 문자 또는 8 개 비트 문자를 가지고, 당신은 혼합 수 있다고 생각과 일치하지 않습니다한다 . 해당 문자열의 일반 ASCII 문자는 실제로 16 비트 문자입니다. – Kratz

+0

어떤 플랫폼입니까? VisualC (++)/gcc/ANSI C? – xanatos

+2

@Kratz 여기에 놀라운 세계가 있습니다 ... MBCS와 UTF-8로 가득 찬 세계 : – xanatos

답변

4

순수 C89 답변 :

#include <stdlib.h> 
#include <stdio.h> 
#include <locale.h> 
#include <string.h> 

int main() 
{ 
    char const* str; 
    size_t slen; 
    char* rev; 

    setlocale(LC_ALL, ""); 
    str = "abcd汉字efg"; 
    printf("%s\n", str); 
    slen = strlen(str); 
    rev = malloc(slen+1)+slen; 
    *--rev = '\0'; 
    while (*str != '\0') { 
     int clen, i; 
     clen = mblen(str, slen); 
     if (clen == -1) { 
      fprintf(stderr, "Bad encoding\n"); 
      return EXIT_FAILURE; 
     } 
     for (i = 0; i < clen; ++i) { 
      *--rev = str[clen-1-i]; 
     } 
     str += clen; 
    } 
    printf("%s\n", rev); 
    return 0; 
} 
+1

감사합니다. 작동합니다. BTW, 프로그램 끝 부분에서 로케일을 다시 설정해야합니까? – Alcott

3

문자열이 utf8로 인코딩 된 경우 매우 간단합니다. 의 길이는 첫 번째 바이트 만 검사하여 잘 형성된 utf8 시퀀스를 얻을 수 있습니다.

첫 번째 패스에서는 utf8 "서브 시퀀스"(길이가 1보다 큰 문자) 두 번째 패스에서는 전체 문자열을 뒤집습니다. Voila.

+0

+1 영리하면서도 간단한 해결책. 그것은 최적이 아닙니다 (2 패스). 구현하기 쉽고 올바른지 확인하십시오. –

+0

@wildplasser, 방금 vim을 통해 우분투의 gnome-terminal 밑에 프로그램을 썼고, 내 게시물을 다시 편집했고, 내가 추가 한 출력에는 비 ASCII 문자 대신 횡설수설 한 텍스트가 포함되어있었습니다. – Alcott

+0

음, 아마도 utf8로 인코딩되지 않았을 수도 있습니다. Remeber, * * your string; -] – wildplasser

관련 문제