LINUX.ORG.RU

В какой кодировке? Если в не-юникод, то проблем нет, если уникод, то переводи в UCS32, чары будут по 4 байта все.

anonymous
()

Перекодировать из локальной кодировки в std::wstring, перевернуть, перекодировать обратно. Стандартными средствами C++ это возможно, хоть и чирижжопу, но я так и не асилил, т. к. пользуюсь Qt. :)

ero-sennin ★★
()

В рамках стандарта C99.
Должно работать с любой локалью, включая юникодные.

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

int reverse_mb_str(const char *mbstr, char **dest);
int mb_str_to_wc_str(const char *mbstr, wchar_t **dest);
int wc_str_to_mb_str(const wchar_t *wcstr, char **dest);
int reverse_wc_str(wchar_t *wcstr);

int main()
{
    char mbstr[1025];
    char *result = NULL;

    setlocale(LC_ALL, "");

    if (scanf("%1024s", mbstr) == EOF) {
	if (ferror(stdin) != 0) {
	    perror("scanf");
	    abort();
	}
	exit(EXIT_SUCCESS);
    }

    if (reverse_mb_str(mbstr, &result) != 0) {
	exit(EXIT_FAILURE);
    }

    assert(result != NULL);
    printf("%s\n", result);
    free(result);

    return 0;
}


int reverse_mb_str(const char *mbstr, char **dest)
{
    wchar_t *wcstr = NULL;

    if (mb_str_to_wc_str(mbstr, &wcstr) != 0) {
	return 1;
    }

    assert(wcstr != NULL);
    if (reverse_wc_str(wcstr) != 0) {
	free(wcstr);
	return 1;
    }

    if (wc_str_to_mb_str(wcstr, dest) != 0) {
	free(wcstr);
	return 1;
    }

    free(wcstr);

    return 0;
}


int mb_str_to_wc_str(const char *mbstr, wchar_t **dest)
{
    mbstate_t st;
    size_t wcstrlen;
    const char *s;
    
    memset(&st, 0, sizeof(st));
    s = mbstr;

    wcstrlen = mbsrtowcs(NULL, &s, 0, &st);
    if (wcstrlen == (size_t)(-1)) {
	perror("mbsrtowcs");
	return 1;
    }

    *dest = (wchar_t*)malloc(sizeof(wchar_t) * (wcstrlen + 1));
    if (*dest == NULL) {
	perror("malloc");
	return 1;
    }

    memset(&st, 0, sizeof(st));
    s = mbstr;

    if (mbsrtowcs(*dest, &s, wcstrlen + 1, &st) == (size_t)(-1)) {
	perror("mbsrtowcs");
	free(*dest);
	return 1;
    }

    return 0;
}


int wc_str_to_mb_str(const wchar_t *wcstr, char **dest)
{
    mbstate_t st;
    size_t mbstrlen;
    const wchar_t *s;

    memset(&st, 0, sizeof(st));
    s = wcstr;

    mbstrlen = wcsrtombs(NULL, &s, 0, &st);
    if (mbstrlen == (size_t)(-1)) {
	perror("wcsrtombs");
	return 1;
    }

    *dest = (char*)malloc(mbstrlen + 1);
    if (*dest == NULL) {
	perror("malloc");
	return 1;
    }

    memset(&st, 0, sizeof(st));
    s = wcstr;

    if (wcsrtombs(*dest, &s, mbstrlen + 1, &st) == (size_t)(-1)) {
	perror("wcsrtombs");
	free(*dest);
	return 1;
    }

    return 0;
}


int reverse_wc_str(wchar_t *wcstr)
{
    wchar_t *l;
    wchar_t *r;
    wchar_t t;
    if (wcstr == NULL)
	return 1;

    l = wcstr;
    r = wcstr + wcslen(wcstr);
    if (l == r)
	return 0;

    while (l < --r) {
	t = *l;
	*l = *r;
	*r = t;
	++l;
    }

    return 0;
}

Legioner ★★★★★
()

Строка не его, он просто разместил обьяву.. какие могут быть предъявы?

anonymous
()
Ответ на: комментарий от Legioner

#include <iostream>
#include <QString>
#include <QTextStream>

QString reverse(const QString & text)
{
        QString tmp;
        const QChar *data = text.constData();
        for (const QChar *c = data + text.size(); --c >= data; ) {
                tmp.append(*c);
        }
        return tmp;
}

int main()
{
        QTextStream in(stdin);
        QTextStream out(stdout);
        QString s = in.readAll().trimmed();
        out << reverse(s) << endl;

        return 0;
}

ero-sennin ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.