snprintf без знака долго добавляя запятую - PullRequest
1 голос
/ 03 февраля 2012

Я пытаюсь преобразовать unsigned long в строку символов, добавляя запятую в конце it. При компиляции и запуске тестового кода, который вы можете найти ниже, я получаю следующий вывод:

"1234," "1234"
"1234"

Тестовый код:

#include <cstdio>
#include <iostream>

int main () {

    unsigned long c = 1234;
    char ch[50];
    char ch1[50];

    sprintf(ch, "%lu,", c);
    std::cout << "\"" << ch << "\"" << " \"" << c << "\"" << std::endl;

    snprintf(ch1, 5, "%s", ch); 
    std::cout << "\"" << ch1 << "\"" << std::endl;

    return 1;
}

Насколько я понимаю, ch должен иметь длину 5, 4 цифры плюс 1 для запятой.

Мне не хватает дополнительного плюса для символа завершения?

Ура! * * 1013

Ответы [ 5 ]

3 голосов
/ 03 февраля 2012

Размер, который передается в snprintf, включает завершающий нулевой символ. Хотя он не печатается, он все равно занимает место в буфере.

Вы должны вместо этого передать strlen(ch) + 1. Или, что еще лучше, достаточно просто sizeof(ch1), поскольку вы хотите разместить весь результат перед заполнением буфера.

Также убедитесь, что буфер назначения всегда имеет достаточный размер, равный или превышающий размер, который вы передаете snprintf. В вашем конкретном случае это вряд ли произойдет, но в целом вы должны помнить об этом.

1 голос
/ 03 февраля 2012

C ++ путь:

#include <string>

unsigned long int c = 1234;

std::string s = "\"" + std::to_string(c) + ",\"";
std::string t = '"' +  std::to_string(c) + ',' + '"'; // alternative
1 голос
/ 03 февраля 2012

Со страницы руководства Linux :

Функции snprintf () и vsnprintf () записывают не более байтов размера (включая завершающий нулевой байт ('\ 0')) в строку.

Так что да, у вас также должна быть длина 6, чтобы получить запятую.

0 голосов
/ 03 февраля 2012

Как отметили несколько человек, вам нужно включить достаточно места для нулевого терминатора.

Всегда стоит проверить, что результат, возвращаемый snprintf, также является тем, чем, по вашему мнению, он должен быть.

Наконец, я бы порекомендовал использовать snprintf (buffer, sizeof (buffer) и т. Д.)

Вы с меньшей вероятностью получите смущающие результаты, если второй параметр окажется больше, чем фактическое пространство, которое вы 'мы доступны.

0 голосов
/ 03 февраля 2012

Как вы написали, вам не хватает дополнительного пробела для символа завершения.

Функции snprintf () и vsnprintf () записывают не более байтов размера (включая завершающий нулевой байт ('\ 0')) на стр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...