LINUX.ORG.RU

История изменений

Исправление Gyros, (текущая версия) :

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

int mbwidth(const char* in)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len =  mbsrtowcs(NULL, &in, 0, &state);
    return (int)len;
}


int main()
{
	setlocale(LC_ALL, "");
	char s1[] = "Hello";
	char s2[] = "Привет Friend";

	size_t l1 = strlen(s1);
	size_t l2 = strlen(s2);
	int w1 = mbwidth(s1);
	int w2 = mbwidth(s2);

	printf("%*s| %2d %2ld\n", 30, s1, w1, l1); //работает; или так
        printf("%30s| %2d %2ld\n", s1, w1, l1); // тоже работает
	printf("%*c%s| %2d %2ld\n", 30-w2, ' ' , s2, w2, l2); // работает

	printf("%30s|\n",  s2); // так выравнивание не работает

	return 0;
}

Соотв. надо проверять если mbwidth(s)!= strlen(s), то выводим с заполнением пробельным символом «%*c%s\n», иначе - обычным способом «%30s\n»

                         Hello|  5  5
                         Hello|  5  5
                 Привет Friend| 13 19
           Привет Friend|

Исправление Gyros, :

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

int mbwidth(const char* in)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len =  mbsrtowcs(NULL, &in, 0, &state);
    return (int)len;
}


int main()
{
	setlocale(LC_ALL, "");
	char s1[] = "Hello";
	char s2[] = "Привет Friend";

	size_t l1 = strlen(s1);
	size_t l2 = strlen(s2);
	int w1 = mbwidth(s1);
	int w2 = mbwidth(s2);

	printf("%*s| %2d %2ld\n", 30, s1, w1, l1); //работает; или так
        //printf("%30s| %2d %2ld\n", s1, w1, l1); // тоже работает
	printf("%*c%s| %2d %2ld\n", 30-w2, ' ' , s2, w2, l2); // работает

	printf("%30s|\n",  s2); // так выравнивание не работает

	return 0;
}

Соотв. надо проверять если mbwidth(s)!= strlen(s), то выводим с заполнением пробельным символом «%*c%s\n», иначе - обычным способом «%30s\n»

                         Hello|  5  5
                 Привет Friend| 13 19
           Привет Friend|

Исходная версия Gyros, :

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

int mbwidth(const char* in)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len =  mbsrtowcs(NULL, &in, 0, &state);
    return (int)len;
}


int main()
{
	setlocale(LC_ALL, "");
	char s1[] = "Hello";
	char s2[] = "Привет Friend";

	size_t l1 = strlen(s1);
	size_t l2 = strlen(s2);
	int w1 = mbwidth(s1);
	int w2 = mbwidth(s2);

	printf("%*s| %2d %2ld\n", 30, s1, w1, l1);
	printf("%*c%s| %2d %2ld\n", 30-w2, ' ' , s2, w2, l2); // работает

	printf("%30s|\n",  s2); // так выравнивание не работает

	return 0;
}

Соотв. надо проверять если mbwidth(s)!= strlen(s), то выводим с заполнением пробельным символом «%*c%s\n», иначе - обычным способом «%30s\n»

                         Hello|  5  5
                 Привет Friend| 13 19
           Привет Friend|