Visual studio 2005: string into char*
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?
И памяти надо больше выделять на 1, чтоб еще под завершающий ноль хватило.
Только вот зачем такой изврат как в коде слабо понятно.
С размером все нормально: там же t - начинается с нуля...
Изврат - не спорю, просто читается строка которая может быть как угодно(?) большой, после чего передается в некую функцию как char*.
Однако, почему-то некоторые функции отказаваются принимать подобное выражение без дополнительных преобразований. Приходится писать (char *)line.c_str().
Спасибо.
Спасибо.
Спасибо за медвежью услугу...
Однако, почему-то некоторые функции отказаваются принимать подобное выражение без дополнительных преобразований.
А если разобраться, почему они так делают?
Приходится писать (char *)line.c_str().
Не надо так писать.
const charT* c_str ( ) const;
char *str = new char[strlen(old.c_str())+1];
strcpy(str,old.c_str());
...
delete[] str;
А если разобраться, почему они так делают?
Не надо так писать.
Каюсь. Сам использовал такую конструкцию там, где был уверен, что такая преобразованная строка будет использована только для чтения.
Тут моя ошибка в том, что в тех самодельных функциях, которым я передавал такую строку, я не добавлял параметру const.
Если есть вероятность, что функция будет пытаться что-то записывать в эту константную строку, то использовать такое преобразование нельзя.
Есть еще вопросик есть указатель на массив строк char *arr[];
как присвоить некому символу из arr некое значение r[j], где char *r=new char[...];
С размером все нормально: там же t - начинается с нуля...
Да какая разница с чего начинается нумерация? Выделяется то памяти ровно в len элементов char. len - это просто длина строки. А надо len+1, чтобы влез еще завершающий ноль.
Изврат - не спорю, просто читается строка которая может быть как угодно(?) большой, после чего передается в некую функцию как char*.
Тогда зачем все эти промежуточные манипуляции? Можно же сразу читать в char * Си-шными функциями. И исспользовать или уж C-строки или C++ строки. А не понятьно зачем эта мешанина. )
Вобщето такой конструкцией:
char *t=new char[len];
или
char some[len];
выделяется ровно len элементов, а не len+1. С нумерацией от нуля до len-1. Индекс len - это уже выход за пределы выделенной памяти. И обращение к нему, а темболее запись в него - грубейшая ошибка. Все работает пока только по случайности, при других условиях так же легко может сломаться. А может и сейчас не работает, а гдето в другом месте вылазит наведенная ошибка.
Есть еще вопросик есть указатель на массив строк char *arr[];
как присвоить некому символу из arr некое значение r[j], где char *r=new char[...];
arr[j] = someChar;
Условия вопроса были следующие: из файла считывается строка неопределённой длины, затем эта строка должна передаться как c-строка в функцию, которая может её менять.
Предложенный метод решает эту задачу. Вы же без доказательств утверждаете, что метод плохой . Покажите более красивый метод, если он есть.
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];
"обнаружена ошыбка приложение будет закрыто..."
Что значит someChar?
Просто какая то переменная типа char. Это же пример.
"обнаружена ошыбка приложение будет закрыто..."
Ну вот если бы объявил sdf как char sdf[100][100];
тогда так еще можно было бы делать, хотя вот это:
sdf[0]="blabla";
всеравно тогда некорректно.
А такой записью:
char *sdf[100];
выделяется 100 неинициализированных указателей на char. Никто память на эти указатели под "вторую размернось массива" не выделял. Соответсвенно попытка проиндексировать ее и даже чето поменять - некорректна и в данном случае фатальна.
char *sdf[100];
some[0]=' ';
sdf[0]="blabla";
sdf[0][0]=some[0];
"обнаружена ошыбка приложение будет закрыто..."
В последнем случае вы установили значение указателя sdf[0] равным адресу стороковой константы "blabla" из таблицы строк, а затем попытались изменить один из символов константы.
char *sdf[100];
sdf[0]=new char[10];
sdf[0][0]=
Не подозревал что если "xxxx" - то тогда указатель на константу... время терял, парился.
эта ф-я знает сколько копировать и кудаи когда нулём закрывать, а вот
sdf это просто адрес равно как и sdf[0], в с++ массивы это последовательность данных