Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильно объеденить строки, и переменные 
:(
    Опции темы
Mishail
Дата 1.10.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Друзья!

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

Принимая во внимание множество способов и функций (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 Фактор быстроты выполнения программы - главный.


}






С уважением, Михаил.
PM MAIL   Вверх
archimed7592
Дата 1.10.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Код

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");
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 1.10.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

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]);


Это сообщение отредактировал(а) MAKCim - 1.10.2007, 17:49


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
akizelokro
Дата 2.10.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

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");


Это сообщение отредактировал(а) akizelokro - 2.10.2007, 10:47


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.