Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Visual studio 2005: string into char*

34K
15 марта 2008 года
Alkaw
14 / / 15.03.2008
//Читаеться строка:
ifstream in1("as.txt");
string line;
if(!in1) {
cout << "Cannot open file: " << endl;
in1.close();
}
getline(in1,line);
int len =line.size();//узнаем ее длину
char *t=new char[len];//как теперь в t втыкнуть строку line?
240
15 марта 2008 года
aks
2.5K / / 14.07.2006
strcpy(t, line.c_str());

И памяти надо больше выделять на 1, чтоб еще под завершающий ноль хватило.
Только вот зачем такой изврат как в коде слабо понятно.
34K
15 марта 2008 года
Alkaw
14 / / 15.03.2008
СПАСИБО!
С размером все нормально: там же t - начинается с нуля...
Изврат - не спорю, просто читается строка которая может быть как угодно(?) большой, после чего передается в некую функцию как char*.
87
16 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Насколько я понимаю, тут нет необходимости в создании указателя t. В функцию можно передать line.c_str().

Однако, почему-то некоторые функции отказаваются принимать подобное выражение без дополнительных преобразований. Приходится писать (char *)line.c_str().
34K
16 марта 2008 года
Alkaw
14 / / 15.03.2008
"Приходится писать (char *)line.c_str()."
Спасибо.
3
16 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: Alkaw
"Приходится писать (char *)line.c_str()."
Спасибо.


Спасибо за медвежью услугу...

Цитата: Kogrom

Однако, почему-то некоторые функции отказаваются принимать подобное выражение без дополнительных преобразований.


А если разобраться, почему они так делают?

Цитата: Kogrom

Приходится писать (char *)line.c_str().


Не надо так писать.

14K
16 марта 2008 года
stimpi
100 / / 04.09.2007
понятное дело что некоторые функции не принимают из-за константности, смотри описание этой функции

 
Код:
( basic_string<charT,traits,Allocator> )
const charT* c_str ( ) const;
по идее надо делать так (хотя я не уверен)

 
Код:
string old("Hello");
char *str = new char[strlen(old.c_str())+1];
strcpy(str,old.c_str());
...
delete[] str;
87
16 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Спасибо за медвежью услугу...
А если разобраться, почему они так делают?
Не надо так писать.



Каюсь. Сам использовал такую конструкцию там, где был уверен, что такая преобразованная строка будет использована только для чтения.

Тут моя ошибка в том, что в тех самодельных функциях, которым я передавал такую строку, я не добавлял параметру const.

Если есть вероятность, что функция будет пытаться что-то записывать в эту константную строку, то использовать такое преобразование нельзя.

34K
16 марта 2008 года
Alkaw
14 / / 15.03.2008
Строка в функции не изменяется, а +1 к размеру мне кажется зря... все конает (например for (i=0;r!=NULL;i++) ). 0,1,2,... n: k=n+1, а не n, где n - полезная длинна строки.

Есть еще вопросик есть указатель на массив строк char *arr[];
как присвоить некому символу из arr некое значение r[j], где char *r=new char[...];
240
16 марта 2008 года
aks
2.5K / / 14.07.2006
Цитата: Alkaw
СПАСИБО!
С размером все нормально: там же t - начинается с нуля...


Да какая разница с чего начинается нумерация? Выделяется то памяти ровно в len элементов char. len - это просто длина строки. А надо len+1, чтобы влез еще завершающий ноль.

Цитата: Alkaw
СПАСИБО!
Изврат - не спорю, просто читается строка которая может быть как угодно(?) большой, после чего передается в некую функцию как char*.


Тогда зачем все эти промежуточные манипуляции? Можно же сразу читать в char * Си-шными функциями. И исспользовать или уж C-строки или C++ строки. А не понятьно зачем эта мешанина. )

240
16 марта 2008 года
aks
2.5K / / 14.07.2006
Цитата: Alkaw
Строка в функции не изменяется, а +1 к размеру мне кажется зря... все конает (например for (i=0;r!=NULL;i++) ). 0,1,2,... n: k=n+1, а не n, где n - полезная длинна строки.


Вобщето такой конструкцией:
char *t=new char[len];
или
char some[len];
выделяется ровно len элементов, а не len+1. С нумерацией от нуля до len-1. Индекс len - это уже выход за пределы выделенной памяти. И обращение к нему, а темболее запись в него - грубейшая ошибка. Все работает пока только по случайности, при других условиях так же легко может сломаться. А может и сейчас не работает, а гдето в другом месте вылазит наведенная ошибка.

Цитата: Alkaw

Есть еще вопросик есть указатель на массив строк char *arr[];
как присвоить некому символу из arr некое значение r[j], где char *r=new char[...];


arr[j] = someChar;

87
16 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: aks
Тогда зачем все эти промежуточные манипуляции? Можно же сразу читать в char * Си-шными функциями. И исспользовать или уж C-строки или C++ строки. А не понятьно зачем эта мешанина. )



Условия вопроса были следующие: из файла считывается строка неопределённой длины, затем эта строка должна передаться как c-строка в функцию, которая может её менять.

Предложенный метод решает эту задачу. Вы же без доказательств утверждаете, что метод плохой . Покажите более красивый метод, если он есть.

240
17 марта 2008 года
aks
2.5K / / 14.07.2006
Я ничего не утверждаю и не говорю про плохость метода. Не надо мне приписывать, чего нет. Я интересуюсь у автора - действительно ли он делает, что хочет? Возможно ему и надо просто сразу считать сколько надо из файла в C строку?
34K
18 марта 2008 года
Alkaw
14 / / 15.03.2008
Цитата: aks
Вобщето такой конструкцией:
char *t=new char[len];
или
char some[len];
выделяется ровно len элементов, а не len+1. С нумерацией от нуля до len-1. Индекс len - это уже выход за пределы выделенной памяти. И обращение к нему, а темболее запись в него - грубейшая ошибка. Все работает пока только по случайности, при других условиях так же легко может сломаться. А может и сейчас не работает, а гдето в другом месте вылазит наведенная ошибка.


arr[j] = someChar;



Да я потом прочел что это РАЗМЕР. Я по глупости всегда считал что после new - последний индекс...


Этого уже счас не надо, но для развития...
Что значит someChar?
char some[100];
char *sdf[100];
some[0]=' ';
sdf[0][0]=some[0];
компиляция - ок, но debug error: The variable 'sdf' is being used without being defined. Кажись понятно, но потом:
char some[100];
char *sdf[100];
some[0]=' ';
sdf[0]="blabla";
sdf[0][0]=some[0];
"обнаружена ошыбка приложение будет закрыто..."

240
18 марта 2008 года
aks
2.5K / / 14.07.2006
Цитата: Alkaw

Что значит someChar?


Просто какая то переменная типа char. Это же пример.


Цитата: Alkaw

"обнаружена ошыбка приложение будет закрыто..."



Ну вот если бы объявил sdf как char sdf[100][100];
тогда так еще можно было бы делать, хотя вот это:
sdf[0]="blabla";
всеравно тогда некорректно.

А такой записью:
char *sdf[100];
выделяется 100 неинициализированных указателей на char. Никто память на эти указатели под "вторую размернось массива" не выделял. Соответсвенно попытка проиндексировать ее и даже чето поменять - некорректна и в данном случае фатальна.

87
18 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Alkaw
Кажись понятно, но потом:
 
Код:
char some[100];
    char *sdf[100];
    some[0]=' ';
    sdf[0]="blabla";
    sdf[0][0]=some[0];

"обнаружена ошыбка приложение будет закрыто..."



В последнем случае вы установили значение указателя sdf[0] равным адресу стороковой константы "blabla" из таблицы строк, а затем попытались изменить один из символов константы.

34K
18 марта 2008 года
Alkaw
14 / / 15.03.2008
Экспериментировал, вот толковое решение:
char *sdf[100];
sdf[0]=new char[10];
sdf[0][0]=
Не подозревал что если "xxxx" - то тогда указатель на константу... время терял, парился.
9.3K
19 марта 2008 года
iridum
175 / / 26.08.2007
тобы скопировать строку
 
Код:
strcat(sdf, "xxxx");


эта ф-я знает сколько копировать и кудаи когда нулём закрывать, а вот
sdf это просто адрес равно как и sdf[0], в с++ массивы это последовательность данных
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог