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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cpp и sprintf = проблема... Некоректная работа sprintf 
:(
    Опции темы
qBiN
  Дата 15.12.2005, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопщем суть,возмем простенькую программу:
Код
#include <stdio.h>
char * ins(char *trm,char *gg)
{
     sprintf(trm,"%s%s",trm,gg);
     return trm;
}
int main()
{
    char *ss=ins("ad","vere");
    printf("%s",ss);
    return 0;
}
на lcc (ANSI C compiler) компилется без вопросов и работает на ура.
Возмем Dev-C++(MinGW) и сишный код компилируется,но не работает(программа вылетает с ошибкой) Поглядел мануалы,там вопще говорят что использовать функцию противопоказана потому что возможно переполнение буфера,но мне на это пофигу,так сказать начинающий.
Так вот как сделать что бы sprintf() работал с указателями коректно... smile Или подскажите как можно обойтись без него... код в функции у меня вида(работа с smtp сервером):
Код
sprintf(str,"RCPT TO:<%s>\r\n",rcpt);
rcpt указатель на адресат, str указатель на текст передаваемый функцией send серверу. smile
Помогите пожайлуста =)
PM MAIL   Вверх
Dov
Дата 16.12.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



А так попробуй, в VC++6.0 работает
Код
#include <stdio.h>    
#include <string.h>
#include <malloc.h>

char * ins(char *trm, char *gg)    
{
     char* buf  = (char*)malloc((strlen(trm) + strlen(gg)) * sizeof(char) + 1);
     sprintf(buf,"%s%s\n", trm, gg);
                         
     return buf;    
}
    
int main()    
{    
    char* ss = ins("ad","vere");
    printf("%s",ss);
    
    return 0;    
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
DeadSoul
Дата 16.12.2005, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Dov, а память кто освобождать будет?!


Господа, у меня все в порядке с головой? Почему ЭТО компилится? Почему "ad" смогло преобразоватся к char*?!
За милую душу сожрали данный код MS VS 6 и MS VS 7.1


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Dov
Дата 16.12.2005, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(DeadSoul @ 16.12.2005, 01:00)
Dov, а память кто освобождать будет?!

Чью память? smile


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
DeadSoul
Дата 16.12.2005, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Цитата(Dov @ 16.12.2005, 01:15)
Цитата (DeadSoul @ 16.12.2005, 01:00)
Dov, а память кто освобождать будет?!
Чью память? 

Эту:
char* buf = (char*)malloc((strlen(trm) + strlen(gg)) * sizeof(char) + 1);



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Dov
Дата 16.12.2005, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



покажи - как.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
DeadSoul
Дата 16.12.2005, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Код

#include <stdlib.h>         /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>

void main( void )
{
   char *string;

   /* Allocate space for a path name */
   string = malloc( _MAX_PATH );

   // In a C++ file, explicitly cast malloc's return.  For example,
   // string = (char *)malloc( _MAX_PATH );

   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );// НЕ СДЕЛАЕШЬ ЭТОГО ПОЛУЧИШЬ УТЕЧКИ ПАМЯТИ!
      printf( "Memory freed\n" );
   }
}

Прощу прощения. Забыл поставить копирайт - MSDN

Это сообщение отредактировал(а) DeadSoul - 16.12.2005, 01:30


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Dov
Дата 16.12.2005, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



DeadSoul, ты здесь покажи, на этом примере
Код
#include <stdio.h>     
#include <string.h>    
#include <malloc.h>    
char * ins(char *trm, char *gg)     
{    
     char* buf  = (char*)malloc((strlen(trm) + strlen(gg)) * sizeof(char) + 1);    
     sprintf(buf,"%s%s\n", trm, gg);    
                          
     return buf;     
}    
     
int main()     
{     
    char* ss = ins("ad","vere");    
    printf("%s",ss);    
     
    return 0;     
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
DeadSoul
Дата 16.12.2005, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Код

#include <stdio.h>     
#include <string.h>    
#include <malloc.h>    
char * ins(char *trm, char *gg)     
{    
     char* buf  = (char*)malloc((strlen(trm) + strlen(gg)) * sizeof(char) + 1);    
     sprintf(buf,"%s%s\n", trm, gg);    
                          
     return buf;     
}    
     
int main()     
{     
    char* ss = ins("ad","vere");    
    printf("%s",ss);    
    free( ss );// ТУТА 
    return 0;     
}


Но пример, плохой. Мой вариант:
Код

#include<iostream>
#include<string>
std::string ins(const char *trm, const char *gg)     
{    
     std::string buf(trm);
     buf+=gg;
     buf+='\n';
                          
     return buf;     
}    
     
int main()     
{     
    std::string ss = ins("ad","vere");    
    std::cout<<ss;

    return 0;     
}



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Dov
Дата 16.12.2005, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(DeadSoul @ 16.12.2005, 01:47)
int main()     
{     
    char* ss = ins("ad","vere");    
    printf("%s",ss);    
    free( ss );// ТУТА 
    return 0;     
}

И шо, у тебя такое работает ?

Это сообщение отредактировал(а) Dov - 16.12.2005, 02:00


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
qBiN
Дата 16.12.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Почему "ad" смогло преобразоватся к char*?!
Не забывайте что си гибче =)) Ну даже если будем передовать char* то ничего от этого не изменится....
Код

 char *df="ad",*fd="vere";
    char *ss=ins(df,fd);

Цитата
Но пример, плохой. Мой вариант:
Твой вариант мне не подходит.
Настчет кода с malloc,че-та нидонал мальца...Распишите на Могучим Русском языке,если не затруднит.
Dov респект за код =)
PM MAIL   Вверх
Aleksandor
Дата 16.12.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



qBiN В твоем примере для trm системой резервируется 3 байта (длина строки "ad" плюс нолик) , но потом в trm пишутся еще 4 байта("vere") - переполнение! Резервируй по меньшей мере 7 байт (последний для нуля)
Код

#include <stdio.h>
void ins(char* bob, char *trm, char *gg)
{
     sprintf(bob,"%s%s",trm,gg);
}
int main()
{
    char ss[7];   // накопитель - должен быть достаточной длины!

    ins(ss, "ad","vere"); // печать в накопитель
    printf("%s",ss);        // вывод из накопителя
    return 0;
}


или так

Код

int main()
{
    char* ss;   // накопитель - должен быть достаточной длины!
    ss=(char*) malloc (strlen("ad") + strlen("vere") +1);

    ins(ss, "ad","vere"); // печать в накопитель
    printf("%s",ss);        // вывод из накопителя

    free(ss);
    return 0;
}



Это сообщение отредактировал(а) Aleksandor - 16.12.2005, 10:39


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
qBiN
Дата 16.12.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
еще 4 байта("vere")
Наверное пишется то 5 байтов? "vere"+"\0" то есть байт конца строки,или я не прав?? да и куда девается нулевой байт из строки ad? или он так и остается?
Если остается то как отреагируют функции работающие со строками?
С malloc'ом разобрался.Спасибо всем отписавшемся. Тему думаю можно закрывать... smile
PM MAIL   Вверх
blackofe
Дата 16.12.2005, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(qBiN @ 16.12.2005, 11:27)
Цитата
еще 4 байта("vere")
Наверное пишется то 5 байтов? "vere"+"\0" то есть байт конца строки,или я не прав?? да и куда девается нулевой байт из строки ad? или он так и остается?
Если остается то как отреагируют функции работающие со строками?
С malloc'ом разобрался.Спасибо всем отписавшемся. Тему думаю можно закрывать... smile

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

исходя из вышеизложенного, sprintf возьмет 2 байта первой строки ("ad"), четыре байта второй строки ("vere"), запишет их в буфер bob и в конце (на 6-месте) добавит нолик, дабы потом другие строковые функции могли работать с результирующей строкой (могли узнать, где строка заканчивается).

Это сообщение отредактировал(а) blackofe - 16.12.2005, 21:31
PM MAIL   Вверх
sergejzr
Дата 16.12.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Вылетает, потому что
"tramparam";
VC считает константным, занятым и вылетает, когда пытаешься туда чего нибудь вписать.
Копмиль в релиз и вылетать не будет, но это не значит, что так делать красиво.

Цитата(Dov @ 16.12.2005, 00:53)
И шо, у тебя такое работает ?

А почему не должно работать?

Цитата(qBiN @ 16.12.2005, 10:27)
да и куда девается нулевой байт из строки ad? или он так и остается?

Ты же его переписываешь.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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