HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 20.04.2008, 14:42
ZipaCna
Познающий
Регистрация: 29.02.2008
Сообщений: 66
Провел на форуме:
139469

Репутация: 33
По умолчанию

помогите разобраться почему этот код работает не так как надо....

#include<iostream>
using namespace std;

int main(int argc, char *argv[])
{
char **message_buf;

message_buf = new char*[argc];
for(int u=0;argv[u] != NULL;u++)message_buf[u]=new char[sizeof(argv[u])];


for(int i=0; argv[i] != NULL; i++)
{
strncpy(message_buf[i], argv[i], sizeof(argv[i]));
cout<<"w["<<i<<"]:"<<message_buf[i]<<endl;
}

for(int i=0;argv[i] != NULL;i++)delete [] message_buf[i];
delete []message_buf;
}


кампилю g++(linux)

Запускаю: ./client sdgdfg dfg dfg df gdfg

результат
w[0]:./cl
w[1]:sdgd
w[2]:dfg
w[3]:dfg
w[4]:df
w[5]:gdfg

как видете выводит только первые 4 символа... не предлогать переписать код, важно найти ошибку именно в этом.

Последний раз редактировалось ZipaCna; 20.04.2008 в 17:34..
 
Ответить с цитированием

  #2  
Старый 20.04.2008, 16:14
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

Может так?
Код:
strcpy(message_buf[i], argv[i]);

и вот этого, я думаю будет достаточно:
Код:
 delete []message_buf;

Последний раз редактировалось criz; 20.04.2008 в 16:17..
 
Ответить с цитированием

  #3  
Старый 20.04.2008, 16:38
ZipaCna
Познающий
Регистрация: 29.02.2008
Сообщений: 66
Провел на форуме:
139469

Репутация: 33
По умолчанию

Цитата:
Сообщение от criz  
Может так?
Код:
strcpy(message_buf[i], argv[i]);

и вот этого, я думаю будет достаточно:
Код:
 delete []message_buf;

criz, извени конечно, но ты не прав...

strcpy(message_buf[i], argv[i]) - это опасная конструкция и она подвержена переполнению, так как не проверяет входящую строку на длинну...так что надо юзать именно strncpy.

delete []message_buf; - одного этого не достаточно, надо очиститть память и для каждого элемента...

Последний раз редактировалось ZipaCna; 20.04.2008 в 16:42..
 
Ответить с цитированием

  #4  
Старый 20.04.2008, 17:15
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

ясно
Просто ты указываешь
Код:
sizeof(argv[argc])
, а это 4 байта. Вот я и решил не ограничиваться 4мя байтами
 
Ответить с цитированием

  #5  
Старый 20.04.2008, 17:37
ZipaCna
Познающий
Регистрация: 29.02.2008
Сообщений: 66
Провел на форуме:
139469

Репутация: 33
По умолчанию

Цитата:
Сообщение от criz  
ясно
Просто ты указываешь
Код:
sizeof(argv[argc])
, а это 4 байта. Вот я и решил не ограничиваться 4мя байтами
кстате да спасибо , тут тоже ошибка надо было sizeof(argv[i])

но весь трабл не в этом ..... =((


при выделении памяти под элименты масива не зависимо от того что я передам в argv код

for(int u=0;argv[u] != NULL;u++)message_buf[u]=new char[sizeof(argv[u])];

выделяет по 4 байта.... попробуйте собрать этот исходник под виндой и скажите проблема такая же??

Последний раз редактировалось ZipaCna; 20.04.2008 в 17:40..
 
Ответить с цитированием

  #6  
Старый 20.04.2008, 17:59
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

argv[i] - указатель. sizeof от указателя = 4. Юзай strlen().
 
Ответить с цитированием

  #7  
Старый 20.04.2008, 20:01
ZipaCna
Познающий
Регистрация: 29.02.2008
Сообщений: 66
Провел на форуме:
139469

Репутация: 33
По умолчанию

Цитата:
Сообщение от Forcer  
argv[i] - указатель. sizeof от указателя = 4. Юзай strlen().
Спасибо ошибку понял. Все работает.
 
Ответить с цитированием

  #8  
Старый 21.04.2008, 01:01
Loker
Познающий
Регистрация: 25.10.2007
Сообщений: 69
Провел на форуме:
348179

Репутация: 52
По умолчанию

Ребят помогите.
Нужен любой код бинарного дерева ( чтоб добавлять, удалять редактировать.) На С++.
ПРосто любой рабочий, обыскал моно сказать все и ни как если есть у кого вылоите плз.
 
Ответить с цитированием

  #9  
Старый 21.04.2008, 01:40
De-visible
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме:
4037638

Репутация: 1821


Отправить сообщение для De-visible с помощью ICQ
По умолчанию

_http://forum.vingrad.ru/forum/s/34d46f3f9f3c02ea59529320070694a3/topic-99013/anchor-entry1469467/0.html
_http://programmersforum.ru/showthread.php?p=92241
_http://alglib.sources.ru/sorting/heapsort.php
_http://forum.codenet.ru/showthread.php?t=44506 (паскаль, на всякий случай)
 
Ответить с цитированием

  #10  
Старый 21.04.2008, 01:56
reversys
Участник форума
Регистрация: 22.11.2007
Сообщений: 159
Провел на форуме:
732568

Репутация: 156
По умолчанию

да set в STL используй!
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Сценарии/CMF/СMS 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ