Главная

Строки

Вопрос действительно тупой? но закаленному паскальщику с этим сложнее всего видимо, )
Как правильно будет:
----–
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: Строки

Спасибо всем за ответы, разобрался!
Вот только почему в книгах эти вопросы старательно обходятся стороной??
--–
И вновь продолжается бой

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <i> <img> <strong> <b> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Введите перечисленные символы, чтобы мы убедились, что вы не робот. Не требуется для зарегистрированных пользователей.
6
u
7
8
r
P
Enter the code without spaces and pay attention to upper/lower case.