C++
- 620 ответов
- 0 вопросов
568
Вклад в тег
как это работает
%c
выводит только один. Если на одном выведенном байте остановиться -- получится фигня с вопросом. Но если вывести подряд все байты многобайтового символа -- получится этот символ.как исправить
mblen
, типа того:#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *a = "Привет, мир";
int s;
setlocale(LC_ALL, "");
for (; *a != '\0'; a+=s) {
s = mblen(a, strlen(a));
printf("%.*s-", s, a);
}
return 0;
}
setlocale
нужен для того, чтобы mblen
понял, в какой кодировке символы на входе. Локаль в момент выполнения должна быть совместимой с кодировкой исходника в момент компиляции, если это условие не выполняется, работать будет неправильно. wchar_t
:#include <locale.h>
#include <stdio.h>
#include <stddef.h>
int main() {
wchar_t *a = L"Привет, мир";
setlocale(LC_ALL, "");
for (; *a != '\0'; a++) {
printf("%lc-", *a);
}
return 0;
}
setlocale
нужен для другого: он говорит внутренностям printf
в какую локаль выполняется вывод чтобы в неё конвертировать wchar_t
. Если локаль во время выполнения не будет соответствовать кодировке исходника, код всё равно будет работать. При одинаковой длине ключей, симметричных и асимметричных, криптостойкость алгоритмов разная. И криптостойкость симметричных выше. Асимметричных ниже. ...
Как это объяснить?
int f(int p[][20][30])
{
int i = 1, j = 2, k = 3;
int v = p[i][j][k];
}
...
int p[10][20][30];
f(p);
int f(int *p, int n2, int n3) // p[][n2][n3]
{
int i = 1, j= 2, k = 3;
int v = p[(((i * n2) + j) * n3) + k]; // v = p[i][j][k];
}
...
int p[10][20][30];
f(&p[0][0][0], 20, 30);
int f(int n2, int n3, int p[][n2][n3])
{
int i = 1, j = 2, k = 3;
int v = p[i][j][k];
}
...
int p[10][20][30];
f(20, 30, p);
Есть исходный код на Си, который вызывает функцию на ассемблере, но передаваемые аргументы как получить,