powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатели, строки и функция
24 сообщений из 24, страница 1 из 1
указатели, строки и функция
    #34109373
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот решил наваять функцию substring для char*

Получилось вот что (не обращать внимание на отсутствие проверок выхода за пределы граници т.п.)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
main()
{
char buf[ 1000 ];
int pos =  2 ;
int len =  4 ;

strcpy(buf, "Test string\0");
printf("%s\n", buf);

int i = (int)&buf;
buf[pos + len] = '\0';
strcpy(buf, (char *)(i + pos));
		
printf("%s\n", buf);
}

работает как и задумывалось - вводим "Test string", получаем "st s".
Выношу это в функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
char* strss(char *src, int pos, int len)
{
	int i = (int)&src;
	src[pos + len] = '\0';
	return ((char *)(i + pos));
}

main()
	{
		char buf[ 1000 ];
		int pos =  2 ;
		int len =  4 ;

		strcpy(buf, "Test string\0");
		printf("%s\n", buf);

		printf("%s\n", strss(buf,  2 ,  4 ));
	}
Получаю фигню в виде одиночного символа хранящегося по адресу (i + pos). Что не так?
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109425
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже вы вообще не знакомы со способами обработки строк:
а) вы убиваете исходную строку (ставите ее конец на символе len+pos и не восстанавливаете)
б) возвращаете то, что лежит по адресу i+len

я так понимаю надо:
а) создать новую строку длинной len+1
б) скопировать в нее кусок данной строки
в) вернуть указатель на новую строку

либо
а) завершить нанную строку
б) вернуть src+pos что есть указатель на начало нужной вам строки
в) вернуть исходную строку в первоначальное положение (вернуть зануленный байт)

аффтопитезь
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109464
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за
Код: plaintext
1.
int i = (int)&src;

???

Код: plaintext
1.
char *i = src;
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109481
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhЧто за
Код: plaintext
1.
int i = (int)&src;

???

Код: plaintext
1.
char *i = src;


местный юмор
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109488
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не используюте strcpy, когда памяти могут перекрываться. Используйте memmove
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109494
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin AkhЧто за
Код: plaintext
1.
int i = (int)&src;

???

Код: plaintext
1.
char *i = src;


местный юмор

дух захватывает
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109533
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если ему так приказали реализовать?
Например можно и тпк поправить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
char* strss(char *src, int pos, int len)
{
	int i = (int)src;
	src[pos + len] = '\0';
	return ((char *)(i + pos));
}

main()
{
	char *buf = malloc( 4000 );
	int pos =  2 ;
	int len =  4 ;

	strcpy(buf, "Test string\0");
	printf("%s\n", buf);

	printf("%s\n", strss(buf,  2 ,  4 ));
}
Тогда и ругать никого не надо
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109576
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den_diТогда и ругать никого не надо

На какой эти приведения типов?
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109612
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
char substr(char *str, int pos, int len)
{
str[pos+len]='\0';
return &str[pos];
// или return str+pos;
}
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109651
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Den_diТогда и ругать никого не надо

На какой эти приведения типов?

Как зачем , для понятности автору
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109714
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109722
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}


inline забыл!
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109770
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну вы и черти :))
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109772
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в смысле - спасибо, работает.
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109873
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin Akh
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}


inline забыл!

__fastcoll
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34109923
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Den_di Aklin Akh
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}


inline забыл!

__fastcoll

fastcall не нужен для inline
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34110126
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}

Явно лишняя операция вычитания.
И в меня терзают смутные сомнения - операция присваивания возвращает результат, а не переменную, вроде.
Т.е. конструкция &(a=b) не осмысленна, но, возможно, я просто забыл синтаксис.
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34110134
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname Akh
Код: plaintext
1.
2.
3.
4.
char *strss(char *str, int pos, int len)
{
   return (&(str[pos+len]= 0 ))-len;
}

Явно лишняя операция вычитания.
И в меня терзают смутные сомнения - операция присваивания возвращает результат, а не переменную, вроде.
Т.е. конструкция &(a=b) не осмысленна, но, возможно, я просто забыл синтаксис.

Работает с локальными данными точно, но с char *s="dsafa" обламывается. :) Специально проверял. Согласен, что не корректно. Но само измение исходных данных в функции тоже не корректно (не красиво).
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34110148
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда как. И функция и класс просто делают то, что должны. Возможно существуют задачи, в которых запросто можно портить буфер - поверить в это сложно, вспоминая семейство mid left и right.
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34110159
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да - некорректно.
Если бы это было корректно, то можно было бы писать что-то типа.

int i=0;
int j;
int k;

k = *(&(i=j++));
cout <<k; // выведет 1
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34110170
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чё-то я переборщил с мысленным экспериментом. :(
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34111008
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameКогда как. И функция и класс просто делают то, что должны. Возможно существуют задачи, в которых запросто можно портить буфер - поверить в это сложно, вспоминая семейство mid left и right.

Вообще то, я ни припомню, что бы где-то портился исходный буфер. Что за семейство?
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34112387
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и написал об этом - я тож такое не помню. Все перечисленные мной функции выдают новые объекты. Не помню, правда, strcat что делает - вроде она к первому аргументу добавляет второй.

Тем не менее никто не запрещает писать любые функции. Просто нужно знать, что такой substr отработает ровно один раз и испортит оригинал. Хотя я не понимаю - зачем.
substr из этого примера = strncpy(newBuf,oldBuf+pos,len);
...
Рейтинг: 0 / 0
указатели, строки и функция
    #34112431
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это конец строки не скопирует
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатели, строки и функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]