Строки
knorr 26 октября, 2004 - 09:34.Вопрос действительно тупой? но закаленному паскальщику с этим сложнее всего видимо, )
Как правильно будет:
----–
char *p;
p=(char *)"жопа с ручкой";
----–
const char *p;
char *x;
p="жопа с ручкой";
x=(char *)*p;
----–
или вобще по–другому??
Все понятно, кроме строк(string) этих дурацких.
Re: Строки
Кстати, в книге Thinking in CPP, об этом ни слова нет, описывается тип данных string, в БеОС я его что–то не нашёл (да и в API везде используется char *, к примеру, void func(char *var))
Re: Строки
имелось ввиду, что я не нашёл его в хидерах в /boot/develop/
Re: Строки
Зависит от того, что ты на самом деле хочешь добиться. Ни тот ни другой кусок кода осмысленной цели пока не имеют. :–)
>----–
>char *p;>p=(char *)"жопа с ручкой";
1. за прямое приведение типа без нужды — убивать на месте.
2. Потом ты по этому указателю можешь писать. А твоя строчка — это константа. Эффект зависит от степени кривости компилятора — либо упадет сразу при попытке доступа на запись, либо потом, когда вылезешь за пределы этой сточки и потрешь другие данные, что лежат дальше.
>----–
>const char *p;
>char *x;
>x="жопа с ручкой";
>p=(char *)*x;
3. Перечитываем п.1 еще раз.
4. А здесь ты еще и указатель разыменовываешь в последней строчке. Хоть и к константному его приводишь, но он указывает не на начало строки а на приведенное к указателю содержимое первых четырех (в данном частном случае) байт. Т.е. мусор. Здесь скорее всего даже при попытке чтения получишь ошибку доступа.
а string — это часть стандартной C++ библиотеки STL. Ищи документацию на нее.
Re: Строки
char p[] = «жопа с ручкой»;
Re: Строки
компилятор gcc беосный, который в DevTools.
Да я знаю (или догадываюсь), что из себя представляет char * — указатель на char.
Вот такой примерчик:
void func(char *filename)
{ ..}
.
char *fn;
fn=далее варианты;
Насколько я понимаю, здесь надо взять кусок памяти размером со строку+1 (для ).
Потом как–то эту строку туда запихать.
Без warnings у меня откомпилилась только следущая конструкция:
char fn[2];
fn="i";
func(&fn);
где func описана так (не мной!):
void func(char *fn)
(имена всех функций и переменных умышленно изменены :))
На конструкции типа
char p[];
компилятор вообще говорит error.
Вы же си–программисты, как вы пользуетесь строками длина которых заранее не известна??
Re: Строки
в пердыдущем сообщении, везде где фраза кажется незаконченной написано [слэш]0"
Re: Строки
Вопрос, о чем речь. О С или С++. Это сильно разные языки.
Есть строчные классы в стандартной библиотеке С++.
Кроме того в Be API есть свой класс BString.
Что касается С, то там всегда есть набор POXIX функций для работы со строками — strlen, strdup, strstr и т д.
поэтому получая например в качестве параметра фунции указатель на char,
foo(char * stroka)
{
char bukva_nomer_3;
int dlinastroki = strlen(stroka);
/*правильные строки в C заканчиваются 0–м, на этом strlen основана*/
/* дальше, если нужна отдельная копия, можно создать свой указатель и получить нужную память из системы*/
char *newstr = null;
newstr = malloc(stlen);
/*далее можно скопировать старую строку в новую или вручную в цикле или используя одну из str() функций POSIX–набора и далее работать с ней как с массивом длины dlinstroki*/
bukva_nomer_3 = newstr[2];
/*или */
bukva_nomer_3 = stroka[2];
}
Re: Строки
Желательно для меня использование «низкоуровневых» (т.е. на уровне языка, стандартных методов и функций, операторов) операций, т.е.
1) выяснение длины строки («строка1»+" "+"строка2")
2) резервирование памяти (malloc) под полученную в 1) длину строки
3) копирование (или присвоение) в зарезирвированную память требуемой строки.
Блин, в паскале это делается так
p:char^;
p:=new(length(«долбанная строка с заданной длиной»);{резервирование памяти}
copy(«долбанная строка с заданной длиной»,p,кол–во байт их можно где–то запомнить или опять вызвать length);{копирование}
.
p:=dispose(та же самая длина);{освобождение памяти}
или ещё проще:
p:PChar;
p:="Требуемая мне строка, блин"+inttostr(999);
или ваще просто
p:string;
но это ^^^ просто зарезервированых компилятором 256 байт, что не очень экономично
Re: Строки
include: string.h, malloc.h
char *s;
s = (char*) malloc((strlen(«долбанная строка с заданной длиной») + 1)*sizeof(char));
strcpy(s, «долбанная строка с заданной длиной»);
free(s);
Re: Строки
Спасибо всем за ответы, разобрался!
Вот только почему в книгах эти вопросы старательно обходятся стороной??
--–
И вновь продолжается бой
Отправить комментарий