Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2010, 19:25   #1
Fedcomp
 
Аватар для Fedcomp
 
Регистрация: 13.06.2010
Сообщений: 8
По умолчанию string <==> char

Уже измучился. Пробую перевести char в string, набросал следующую "функцию"
Код:
void chartostr(char charr[], string &ret){
    ret = charr;
    ret[sizeof(ret)] = '\0';
}
Но по какой то совершенно удивительной причине sizeof для строчки ret всегда выдает одно и тоже число. Впрочем это и понятно ведь как раз нет того символа по которому мы пытаемся определить длину. Теперь вопрос, как грубо говоря сделать этот код рабочим? т.е добавить нуль в конец стринговой строки и заодно как его потом убрать от туда если понадобится?

Последний раз редактировалось Stilet; 14.07.2010 в 13:26.
Fedcomp вне форума Ответить с цитированием
Старый 13.07.2010, 19:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Но по какой то совершенно удивительной причине sizeof для строчки ret всегда выдает одно и тоже число.
Ничего удивительного.... Подумайте что такое ret на самом деле...
p51x вне форума Ответить с цитированием
Старый 13.07.2010, 20:07   #3
Fedcomp
 
Аватар для Fedcomp
 
Регистрация: 13.06.2010
Сообщений: 8
По умолчанию

Ссылка на строку (string). Вот я и спрашиваю как туда правильно добавить нуль байт. Ну или как вообще char[] превратить в string
Fedcomp вне форума Ответить с цитированием
Старый 13.07.2010, 20:13   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Но по какой то совершенно удивительной причине sizeof для строчки ret всегда выдает одно и тоже число.
Будет выдавать размер объекта типа String в байтах.
Код:
char mas[4]={'a', 'b', 'c', '\0'};

	string s;
	s = mas;

	cout << s << "\n";
profi вне форума Ответить с цитированием
Старый 13.07.2010, 20:32   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Зачем же так мучиться???
Цитата:
char* cstr1 = "Hello";
std::string sstr(cstr1);
sstr += ", world!";
char* cstr2 = sstr.c_str();
Вот вам преобразования char* => std::string => char*.

Кстати, sizeof(std::string) - это, что логично, размер объекта класса std::string, который по своей внутренней структуре очень сильно отличается от массива символов и в действительности имеет вполне определенную длину.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.07.2010, 13:16   #6
Fedcomp
 
Аватар для Fedcomp
 
Регистрация: 13.06.2010
Сообщений: 8
По умолчанию

И продолжая свои глупые вопросы спрошу что делает следующая конструкция :
PHP код:
char* = "somestr" 
Создает объект char = {s,o,m,e,s,t,r,\0} после чего передает указатель в char* и мы не имеем доступа напрямую к массиву char? для чего такие конструкции используются? (и глупый вопрос в догонку, в чем выгода от указателей * если есть ссылки &?)

Цитата:
Сообщение от profi Посмотреть сообщение
Будет выдавать размер объекта типа String в байтах.
[code]char mas[4]={'a', 'b', 'c', '\0'};

string s;
s = mas;

cout << s << "\n";
Рад бы так сделать, но
Код:
int main(int argc, char* argv[])
{

//== Обработка консольных параметров
string ip;
int port;
bool retry=0;

string par; // par = parameter

for (int i=1; i<argc; i++){

    // Копируем аргумент в sting строку для удобного сравнения
    //par = argv[i];
    //par[sizeof(par)+1] = '\0';
    chartostr(argv[i], par);


    if(par == "-help")
        usage();
    else if(par == "-ip"){
        i++;
        chartostr(argv[i], ip);
        //cout << ip[5] << ip[6] << "WOTAFAKA";
    }else if(par == "-port"){

    }else if(par == "-retry"){
        retry = 1;
    }else{
        cout << "unknown parameter \"" << par << "\" type \"-help\" for available parameters\n";
    }
}
.............................
void chartostr(char charr[], string &ret){
    ret = charr;
    ret[sizeof(ret)] = '\0';
}
Пытаюсь это сделать как то так, и у меня уже есть массив char в конец которого я не могу добавить нуль байт. Сейчас попробую впихнуть сюда вариант Грома

Последний раз редактировалось Stilet; 14.07.2010 в 13:28.
Fedcomp вне форума Ответить с цитированием
Старый 14.07.2010, 13:28   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
char* str = "somestr";
Создает в строковой литерал {s,o,m,e,s,t,r,\0} где-то в памяти программы (как конкретно это реализуется - зависит от компилятора) и присваивает указателю str адрес этого строкового литерала (т.е. константного массива символов).
Кстати, если сделать так:
Код:
char* str1 = "somestr";
char* str2 = new char[strlen(str1)];
strcpy(str2, str1);
то теперь мы вполне можем работать с str2 и модифицировать ее как хотим.
Указатели нужны много для чего. В частности, почитайте про тесную взаимосвязь массивов и указателей.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.07.2010, 14:31   #8
Fedcomp
 
Аватар для Fedcomp
 
Регистрация: 13.06.2010
Сообщений: 8
По умолчанию

На вариант Грома ругается компилятор (MinGw в код::блоках)
Код:
#include <iostream>

using namespace std;

int main()
{
    char* cstr1 = "Hello";
    std::string sstr(cstr1);
    sstr += ", world!";
    char* cstr2 = sstr.c_str();
}
А конкретно на эту строчку
Код:
char* cstr2 = sstr.c_str();
Цитата:
error: invalid conversion from 'const char*' to 'char*'
From Stilet: Я попрошу тебя не выделять Си программы тегом для PHP. Для этих есть кнопка # (по крайней мере в расширенном режиме поста.)

.................
Возможно на форуме уже есть "готовый" парсер консольных параметров?

Последний раз редактировалось Stilet; 14.07.2010 в 14:43.
Fedcomp вне форума Ответить с цитированием
Старый 14.07.2010, 14:52   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Если нужно изменять потом строку, то
Код:
#include <iostream>

using namespace std;

int main()
{
    char* cstr1 = "Hello";
    std::string sstr(cstr1);
    sstr += ", world!";
    char* cstr2 = new char[sstr.length()];
    strcpy(cstr2, sstr.c_str());
}
Если нет, то
Код:
#include <iostream>

using namespace std;

int main()
{
    char* cstr1 = "Hello";
    std::string sstr(cstr1);
    sstr += ", world!";
    const char* cstr2 = sstr.c_str();
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.07.2010, 16:13   #10
Fedcomp
 
Аватар для Fedcomp
 
Регистрация: 13.06.2010
Сообщений: 8
По умолчанию

Код:
std::string sstr(cstr1);
Можно ли как то уже после объявления присваивать? т.е у меня к примеру уже есть объявленный string и я хочу в него забить char* массив

to stillet - прошу прощения, просто это единственный ббкод который делает подсветку

И если
Код:
const char* cstr2 = sstr.c_str();
а потом уничтожить sstr то в char* cstr2 "останется значение"?

Последний раз редактировалось Fedcomp; 14.07.2010 в 16:24.
Fedcomp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
char to string!!! marselik Общие вопросы C/C++ 3 01.06.2010 13:01
из string в char Xcopy Общие вопросы Delphi 2 10.07.2009 17:17
String и Char Volt Общие вопросы Delphi 3 17.02.2009 08:30
из string в char ShenDy Общие вопросы C/C++ 1 14.04.2008 11:01
char->string eds Общие вопросы .NET 1 28.11.2007 17:22