Запутанная проблема snprintf() без добавления 0 ⇐ C++
-
Гость
Запутанная проблема snprintf() без добавления 0
Я столкнулся с запутанной проблемой, связанной с snprintf() при использовании qt5.6 с (mingw 5.3.0 32bit) в Win10.
Мой код выглядит следующим образом:
char *my3DesCBC_Decode_default(char *in_24char_CipherTxt, символ *out_32char_PlainTxt) { интервал xLen = 24; // по умолчанию: 24; интервал len001 = 0; беззнаковый символ *res_PlainTxt; беззнаковый символ *res_decode_Base64; base64_de((беззнаковый символ *)in_24char_CipherTxt, &res_decode_Base64, &xLen); если (des_decode(DES3_CBC, pmingKey16_default, pmingKeyLen_default, pmingVI008_default, res_decode_Base64, &res_PlainTxt, &xLen) == RESULT_OK) { xLen = xLen > 30? 30: ксЛен; // `xLen`: истинная длина расшифрованной строки snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); // проблема из этой строки len001 = strlen(out_32char_PlainTxt); printf("3DES CBC DECODE:%s ;Len=%d,%d\n", out_32char_PlainTxt, xLen, лен001); } } Строка snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); работает. Однако согласно документу, xLen + 0 здесь должно быть xLen + 1. Когда я использую xLen + 1, возникает ошибка, чтобы запустить его снова, мне нужно написать
snprintf(out_32char_CipherTxt,xLen+1,"%s",res_encode_Base64); \*(out_32char_CipherTxt + xLen) = '\0'; Более конкретно, xLen + 1 должно быть правильно, потому что нужен еще один бит для хранения eof '\0', который добавляется с помощью snprintf()< /код> автоматически. Интересно, почему мне приходится добавлять '\0' самому? Есть ли ловушка snprintf() на разных платформах?
Я столкнулся с запутанной проблемой, связанной с snprintf() при использовании qt5.6 с (mingw 5.3.0 32bit) в Win10.
Мой код выглядит следующим образом:
char *my3DesCBC_Decode_default(char *in_24char_CipherTxt, символ *out_32char_PlainTxt) { интервал xLen = 24; // по умолчанию: 24; интервал len001 = 0; беззнаковый символ *res_PlainTxt; беззнаковый символ *res_decode_Base64; base64_de((беззнаковый символ *)in_24char_CipherTxt, &res_decode_Base64, &xLen); если (des_decode(DES3_CBC, pmingKey16_default, pmingKeyLen_default, pmingVI008_default, res_decode_Base64, &res_PlainTxt, &xLen) == RESULT_OK) { xLen = xLen > 30? 30: ксЛен; // `xLen`: истинная длина расшифрованной строки snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); // проблема из этой строки len001 = strlen(out_32char_PlainTxt); printf("3DES CBC DECODE:%s ;Len=%d,%d\n", out_32char_PlainTxt, xLen, лен001); } } Строка snprintf(out_32char_PlainTxt, xLen + 0, "%s", res_PlainTxt); работает. Однако согласно документу, xLen + 0 здесь должно быть xLen + 1. Когда я использую xLen + 1, возникает ошибка, чтобы запустить его снова, мне нужно написать
snprintf(out_32char_CipherTxt,xLen+1,"%s",res_encode_Base64); \*(out_32char_CipherTxt + xLen) = '\0'; Более конкретно, xLen + 1 должно быть правильно, потому что нужен еще один бит для хранения eof '\0', который добавляется с помощью snprintf()< /код> автоматически. Интересно, почему мне приходится добавлять '\0' самому? Есть ли ловушка snprintf() на разных платформах?
Мобильная версия