Проблема с объединением + итоа - PullRequest
0 голосов
/ 01 января 2011

У меня есть следующий код:

char stringHour[50], stringMinute[50], stringSecond[50];

// lots of code...
itoa(hour, stringHour, 10);
itoa(minute, stringMinute, 10);
itoa(second, stringSecond, 10);

strcat(":", stringSecond);
strcat(":", stringMinute);
strcat(stringMinute, stringSecond);
// stringHour contains both HH and :SS:MM
strcat(stringHour, stringMinute);
drawText(HRES/2 - 4, VRES - GLYPH_HEIGHT*2, 
stringHour, black);

hour, minute и second - это целые числа.

Что я хочу сделать, так это время диплайна следующим образом:НН: ММ: СС.

Переменные гарантированно находятся в диапазоне от 0 до 59 (кроме hout, 0-24).

drawText верен.

Этот блок кода приводит к сбою моей программы, иЯ не могу найти ничего плохого в этом.Вы можете?

Спасибо за ваше время!

Ответы [ 5 ]

2 голосов
/ 01 января 2011

Это неправильно:

strcat(":", stringSecond);

Вы не можете использовать строковый литерал для первого аргумента. См. strcat документ.

1 голос
/ 01 января 2011

Также - ваш strcat в обратном порядке.На самом деле strcat «объединяет» - так что меняйте порядок.strcat (stringHour, ":");strcat (stringHour, stringMinute);strcat (stringHour, ":");strcat (stringHour, stringSecond);

Однако это довольно ужасно - почему бы не использовать sprintf?Кроме того - другие библиотеки, кроме построения строк - возможно, заглянуть в BSL.Стандартная библиотека C на самом деле также не проверяет вас на наличие ошибок - так что вы не можете точно понять, что вы делаете и что ожидается от семейства функций str *.

1 голос
/ 01 января 2011

Скорее всего, бит, который терпит неудачу, это кусок:

... stuff removed
strcat (":", 
... other stuff removed

Вы почти наверняка не сможете strcat заполнить строковый литерал на используемой платформе.

Подход strcat также имеет проблемы безопасности переполнения буфера. Может быть, использование snprintf может быть лучшей альтернативой?

1 голос
/ 01 января 2011

Вы не можете изменять строковые литералы; вместо этого используйте char buffer[] = "MyLiteral", а затем strcat().

(Причина этого факта заключается в том, что компилятор может оптимизировать размер кода путем объединения нескольких экземпляров строковых литералов в один экземпляр в секции только для чтения исполняемого файла, и поэтому, если бы вы могли изменить один экземпляр, изменить все остальное, что приведет к непредсказуемому поведению.)

1 голос
/ 01 января 2011

Кроме того, лучше начинать массивы с нуля.

char stringHour[50] = {0}, stringMinute[50] = {0}, stringSecond[50] = {0};

Затем попробуйте сохранить результат cat в строку, чтобы увидеть, что вы придумали.

...