char* oledScreen::getCurrentTime(){
char* hour = malloc(16);
snprintf(hour, 16, "%d", getHour());
char* minute = malloc(16);
snprintf(minute, 16, "%d", getMinute());
char* firstPart = strcat(getHour() < 10 ? strcat("0",hour) : hour, ":");
const char* secondPart = getMinute() < 10 ? strcat("0",minute) : minute;
return strcat(firstPart, secondPart);
};
Я пытаюсь добавить два целых числа, которые я могу получить, используя getHour()
и getMinute()
. Однако мне нужно проверить, меньше ли одно из этих двух значений 10: если это так, мне нужно добавить 0, чтобы вывод был таким: 0X
, где X
— это getHour()
или getMinute()
.
Моя проблема в том, что он не добавляет символ :
. Например, если getHour() = 9
и getMinute() = 15
. Результатом getCurrentTime()
является 0915
, а не 09:15
. У вас есть идеи, почему это так?
snprintf(buffer, buffer_size, "%02d:%02d", getHour(), getMinute())
Кстати, ваш код не C, это C++. Поэтому вам не следует использовать массивы char
или snprintf
для начала.
@Someprogrammerdude или malloc...
strcat("0",hour)
добавляет все, что находится в hour
, к строковому литералу "0"
. Вы не можете добавить что-то к строковому литералу. должен предупредить вас: godbolt.org/z/a48x3bnYo@Armin Montigny Пожалуйста, обратите особое внимание на весь исходный код, прежде чем принять решение об редактировании языковых тегов, особенно когда ответы публикуются на одном языке, после чего уже слишком поздно менять теги. Руководство по использованию тегов см. в вики-сайтах по тегам C и C++.
Начнем с того, что strcat("0",hour)
приведет к неопределенному поведению, когда вы попытаетесь изменить литеральную строку "0"
, что не разрешено.
Вместо того, чтобы использовать несколько вызовов strcat
, почему бы просто не создать строку, достаточно большую, чтобы соответствовать результату, и использовать snprintf
для помещения содержимого в строку?
Использование snprintf
также упростит добавление нулевого префикса к значению часа.
Возможно что-то вроде этого:
// Allocate memory, and actually create the string
// 2 for hour, 2 for minutes, 1 for colon, 1 for terminator
char *result = malloc(6);
snprintf(result, 6, "%02d:%02d", getHour(), getMinute());
return result;
Как упоминалось в комментариях, лучшим решением было бы передать массив result
в качестве аргумента функции. Это лучше справится с владением массивом result
и, возможно, даже не потребует динамического распределения.
[Note that the above is a pure C solution, it's not even valid in C++. I wrote it before noticing that the code in the question is really C++.]
Учитывая, что вы действительно программируете на C++, а не на C, то решение с использованием строковых потоков и std::string
будет более подходящим:
std::string oledScreen::getCurrentTime(){
std::ostringstream oss;
oss << std::setw(2) << std::setfill('0') << getHour() << ':'
<< std::setw(2) << std::setfill('0') << getMinute();
return oss.str();
}
Вероятно, даже лучше, если вызывающая сторона проходит через буфер (и размер), потому что я предполагаю, что в основном вызывающая сторона может использовать буфер на основе стека, избегая выделения кучи.
Кроме того, использование malloc
/free
в C++ крайне проблематично и не рекомендуется, поскольку конструкторы/деструкторы по умолчанию не вызываются.
У вас также есть утечки памяти, кто будет
free
выделять память дляhour
иminute
?