Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Правильно объеденить строки


Автор: Mishail 1.10.2007, 15:30
Друзья!

Полагаю, что похожие темы поднимались уже неоднократно, но тем не менее.

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

Имеем два массива:
Код

long new_array[1024];
long old_array[1024];
 

первый из них (new_array) заполняется некоторыми значениями, после чего сравнивается со вторым (old_array)... так вот - по результатам сравнения необходимо сформировать строку вида:

"Change:nnnn=value;nnnn=value;......;CR" 

без т.н. нуль-терминатора (\0) и определить длину получившейся строки.
 
где: 
Change: = "C" "h" "a" "n" "g" "e" ":" 
nnnn - индекс элемента массива значение которого изменилось
= - собственно знак равенства
value - разница между значениями (new_array[i]-old_array[i])
; - условный разделитель
CR - символ возврата каретки (0x0D)

Код

int i=0;
int result_len=0;


char index[4];
char value[4];

char result_str[8196]; // вопрос (по ходу):  допустима (корректна)  ли такая длина?

.......................

// начинаем формировать конечную строку
// просто копируем строку. Правильно? Или есть другой, более изящный способ?
strcpy(result_str, "Change:");

while (i<1024)     // цикл (к делу не относится:) )
{

     if (new_array[i] != old_array[i]) // вопрос: почему компилятор предупреждает 
                                                       //warning C4018: '!=' : signed/unsigned mismatch

     {
     // преобразуем значения индекса и разницу
     itoa(i,index,10);
     itoa((new_array[i] - old_array[i]),value,10);
     
     // вот тут собственно и вопрос как лучше добавить к result_str
     // index + "=" + value + ";"

     }

// а здесь необходимо добавить к result_str 0x0D
// и определить длину получившейся строки в result_len
// можно ли сделать это посредством strlen? или есть способ пошустрее
// P/s Фактор быстроты выполнения программы - главный.


}






С уважением, Михаил.

Автор: archimed7592 1.10.2007, 15:43
Код

strcpy(result_str, "Change:");
char *pResult = result_str + strlen(result_str);
while (i<1024)     // цикл (к делу не относится:) )
{
    if (new_array[i] != old_array[i])    // вопрос: почему компилятор предупреждает 
                        //warning C4018: '!=' : signed/unsigned mismatch
                        // ответ : потому что у тебя, к примеру long new_array[...] и unsigned long old_array[...]
    {
        // преобразуем значения индекса и разницу
        //itoa(i,index,10);
        //itoa((new_array[i] - old_array[i]),value,10);
        
        // вот тут собственно и вопрос как лучше добавить к result_str
        // index + "=" + value + ";"
        
        sprintf(pResult, "%4d=%d", i, new_array[i] - old_array[i]);
        pResult += strlen(pResult);
    }

    // а здесь необходимо добавить к result_str 0x0D
    // и определить длину получившейся строки в result_len
    // можно ли сделать это посредством strlen? или есть способ пошустрее
    // P/s Фактор быстроты выполнения программы - главный.

    strcat(pResult, "\n");
}

Автор: MAKCim 1.10.2007, 15:46
Код

char * array;
...
strcpy(array, "Change:");
int index, position = 7;
for (index = 0; index < 1024; ++index)
    position += sprintf(array + position, "%d=%d;", index, new_array[index] - old_array[index]);

Автор: akizelokro 2.10.2007, 10:08
Код

int BUFFER_SIZE = ...;
char * str_result[BUFFER_SIZE];

....
int number_elements = sizeof new_array / sizeof new_array[0];
for(int i=0;i<number_elements;++i)
{
    len = snprintf(str_result+position,BUFFER_SIZE-position, "%d=%d;", index, new_array[index] - old_array[index]);
    if(len < 0)
   {
        position = BUFFER_SIZE //строка без завершающего /0
   }
   else
   {
       position += len;//возможны оба случая, с /0 и без
   }
   if(position >= BUFFER_SIZE) // вроде бы и "==" сработает, но сделаю условие жестче
      break;
}


Потом вспомнил, что надо скопировать '/n' и сделать проверку на неравенство элементов массивов

Код

for(int i=0;i<number_elements;++i)
{
    if(new_array[i] == old_array[i])
         continue;
    len = snprintf(str_result+position,BUFFER_SIZE-position-2, "%d=%d;", i, new_array[i] - old_array[i]);
    if(len < 0)
   {
        position = BUFFER_SIZE-2 //строка без завершающего \0
   }
   else
   {
       position += len;//возможны оба случая, с \0 и без
   }
   if(position >= (BUFFER_SIZE-2)) // вроде бы и "==" сработает, но сделаю условие жестче
   {
//    сообщение, что достигнут конец буфера
      break;
   }
}
strcat(str_result+position,"\n");

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)