История изменений
Исправление 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|