2

我遇到了关于如何反转包含此“abcd汉字efg”的字符串的问题。

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

还原后应该是:

str_toreverse = "gfe字汉dcba";

我想,要反转字符串,我必须识别那些非 ASCII 字符,因为我认为简单地反转每个字节不会得到正确的答案。

我该怎么做?

PS:我在 32 位 Ubuntu 下编写了这个程序。然后我打印了每个字节:

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

我得到了一些乱码而不是“汉字”。

4

2 回答 2

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;
}
于 2011-08-30T14:43:52.597 回答
3

如果字符串编码为 utf8,那就很简单了。您可以通过仅检查第一个字节来获得格式良好的 utf8 序列的长度。

在第一遍中,您反转utf8 “子序列”(长度> 1 的那些) 在第二遍中,您反转整个字符串。瞧。

于 2011-08-30T12:22:54.930 回答