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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> char *, как соединить? 
V
    Опции темы
UnixBeginner
Дата 27.1.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть функция
Код

void func2(const char *)
{
...
}

void func(const char * str)
{
func2("sdsdfadsfdas" + str)  //как соединить чтобы небыло ошибки?
}


PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 28.1.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Код

void func2(const char *)
{
...
}

void func(const char * str)
{
char Temp[200];
sprintf(Temp,"%s%s","sdsdfadsfdas",str);
func2(Temp)  //как соединить чтобы небыло ошибки?
}



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
UnixBeginner
Дата 28.1.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большое спасибо!
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 28.1.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



bel_nikita, использовать для этих целей sprintf - из пушкт по воробьям.

use strcat


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

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


Опытный
**


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

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



UnixBeginner, прочитай вот это: СИ СТРОКИ ИЛИ НЕМНОГО ТЕОРИИ
Добавлено @ 01:48
и вот это: Сложение строк


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
UnixBeginner
Дата 30.1.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я конечно понимаю, sprintf() возможно не оптимальный способ, но просто strcat() кпримеру не работает - программа вылетает просто.
Код

#include <cstrings>
...
...
char * str = "bla bla";
char * str1 = "bla bla";
strcat(str, str1);
//а дальше вылетает.


PM MAIL WWW ICQ   Вверх
BreakPointMAN
Дата 30.1.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UnixBeginner @ 30.1.2006, 15:26 Найти цитируемый пост)

Я конечно понимаю, sprintf() возможно не оптимальный способ, но просто strcat() кпримеру не работает - программа вылетает просто.

Естественно, не работает. smile
Во-первых, в str не зарезервировано места для дописываемой строки (первый параметр функции strcat является одновременно и буфером), а во вторых это вообще указатель на строковую константу, которую менять нельзя.
Тебе зачем ссылки дали почитать?! smile


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
UnixBeginner
Дата 30.1.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если мне не известен размер будущей строки. А слишком большой объем неохото вводить? Всеж конкатенация SQL запросов!
PM MAIL WWW ICQ   Вверх
_hunter
Дата 30.1.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



что значит неизвестен?
он будет равен длине текущей строки + длина приклеиваемой строки + 1


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
azesmcar
Дата 30.1.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



А std::string уже не в моде?
PM   Вверх
UnixBeginner
Дата 30.1.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну ладно, был не прав smile
PM MAIL WWW ICQ   Вверх
pablo
Дата 30.1.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



А нельзя ли вмесно char *, использовать std::string ?
Ну и потом склеить их оператором сложения.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
UnixBeginner
Дата 30.1.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



std::string можно, но функция требует в качестве параметра const char *
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 30.1.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



ну так пользуйся string'ом а далее ф-ции отдай указатель на char smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
azesmcar
Дата 30.1.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата

std::string можно, но функция требует в качестве параметра const char *

а что тебе мешает?
Цитата

ну так пользуйся string'ом а далее ф-ции отдай указатель на char smile


Код


void my_func(const char *p);

int main()
{
   std::string s1 = "string1";
   std::string s2 = "string1";
   std::string s3 = s1 + s2;

   my_func( s3.c_str() );
   //или убираем std::string s3 ... и делаем
   //my_func( (s1+s2).c_str() );
   return 0;
}

void my_func(const char *p)
{
//...
}


PM   Вверх
kirjanov
Дата 31.1.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

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



лучше использовать strncat() или snprintf() ;)
PM MAIL   Вверх
Romikgy
Дата 31.1.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Не знаю как
Цитата(kirjanov @ 31.1.2006, 11:26 Найти цитируемый пост)

лучше

кому чем удобнее smile
ЗЫ А вооще то , имхо, в реализации класса string суммирование так и сделанно через
Цитата(kirjanov @ 31.1.2006, 11:26 Найти цитируемый пост)

strcat()

smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Mayk
Дата 31.1.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Romikgy @ 31.1.2006, 16:35 Найти цитируемый пост)

ЗЫ А вооще то , имхо, в реализации класса string суммирование так и сделанно через

Скорее нет, чем да по нескольким причинам.
1) Вообще говоря не существует шаблонной ф-ции str[n]cat. А basic_string<char> - это всё же шаблонный класс. wcscat это конечно очень хорошо, но будут ли разработчики заморачиваться на этот счёт?

2) Длина строки скорее известна заранее(она shouldвычислятся за константное время (в SUS3 по поводу should сказано

Цитата(SUS3)

should
....that is recommended but not mandatory....
, станадарт C++ слово "should" вроде не определяет)

В случае константного size() использовать strcat крайне не разумно (strcat(str,append) по своей сути это в точности strcpy(str+strlen(str),append);, а линейный strlen() нам не нужен - мы можем узнать его значение за константное время).




А вот это реализация из гнуса:
Код

//basic_string.h
     static void
      _M_copy(_CharT* __d, const _CharT* __s, size_type __n)
      {
        if (__n == 1)
          traits_type::assign(*__d, *__s);
        else
          traits_type::copy(__d, __s, __n);
      }
//basic_string.tcc
  template<typename _CharT, typename _Traits, typename _Alloc>
    basic_string<_CharT, _Traits, _Alloc>&
    basic_string<_CharT, _Traits, _Alloc>::
    append(const _CharT* __s, size_type __n)
    {
      __glibcxx_requires_string_len(__s, __n);
      if (__n)
        {
          _M_check_length(size_type(0), __n, "basic_string::append");
          const size_type __len = __n + this->size();
          if (__len > this->capacity() || _M_rep()->_M_is_shared())
            {
              if (_M_disjunct(__s))
                this->reserve(__len);
              else
                {
                  const size_type __off = __s - _M_data();
                  this->reserve(__len);
                  __s = _M_data() + __off;
                }
            }
          _M_copy(_M_data() + this->size(), __s, __n);
          _M_rep()->_M_set_length_and_sharable(__len);
        }
      return *this;
    }




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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