Выделение подстроки.

Здесь все вопросы по языку программирования С
kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Выделение подстроки.

Сообщение kosmas » 29 сен 2016, 16:35

Код: Выделить всё

char hello[] = "HELLO BABY";

char ell[] = {0};

char substr( char str, uint8_t offset, uint8_t count){
		char substr[] = {0};
		for (uint8_t i=1; i <= count; i++)
		{ substr[i] = str[(i+offset)];  }   //копируем посимвольно в новую строку
		substr[(count+1)] = 0;    // формируем конец строки
	return substr;
}

ell = substr(hello, 3, 4);
По идее, ell должно содержать "LO B", но почему-то не получается... :(

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Выделение подстроки.

Сообщение gurvinok » 29 сен 2016, 18:36

:shock: :shock: :shock:
Как это вообще скомпилилось???
Что нужно сделать?
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: Выделение подстроки.

Сообщение kosmas » 30 сен 2016, 07:31

А оно и не скомпилилось... :) Я запутался в указателях... Вот так скомпилилось:

Код: Выделить всё

char test[] = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm";

char msg[] = "";

char substr( char * str, uint8_t offset, uint8_t count){
		char substr[] = {0};
		for (uint8_t i=0; i < count; i++)
		{
  		substr[i] = str[(i+offset)];		
	  }
		substr[(count-1)] = 0;
		return * substr;
}

lcd_gotoxy(0,0);
*msg= substr((char*)test, 8, 5);
lcd_str_out(msg);
Но что-то тут не так...

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Выделение подстроки.

Сообщение gurvinok » 30 сен 2016, 10:39

#include <avr/io.h>
#include <stdio.h>

#include "main_init.h"
#include "axlib/lcd.h"

// Здесь должны находиться ваши подключаемые файлы


// Здесь должны находиться ваши глобальные переменные

// BYTE *str - Массив строки которую обрезать
// UBYTE start - Символ с которого сохранить текст
// UBYTE count - Сколько символов сохранить
// Функция ничего невозвращает, она лишь складывает новую строку в передаваемый массив.

void substring(BYTE *str, UBYTE start, UBYTE count)
{
BYTE temp = 0;

for(BYTE i = 0; i < count; i++)
{
str += start;
temp = *str;
str -= start;
*str = temp;
str++;
}
*str = 0x00;
}


int main(void)
{
// Здесь должны находиться ваши локальные переменные
BYTE string_in[] = "HELLO BABY";

// Инициализация дисплея
lcd_init(0);

lcd_str_out(string_in);

// Вырезаем подстроку и кладем в тот же массив
substring(string_in, 3, 4);

lcd_gotoxy(0,1);
lcd_str_out(string_in);

while(1)
{

// Здесь должен находиться ваш код
}
}
Вложения
P9302297.JPG
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: Выделение подстроки.

Сообщение kosmas » 30 сен 2016, 14:28

Так нечестно! Это колдунство!!! :)

Код: Выделить всё

1. for(BYTE i = 0; i < count; i++)
2. {
3. str += start;
4. temp = *str;
5. str -= start;
6. *str = temp;
7. str++;
8. }
9. *str = 0x00;
Могу я слезно просить о двух вещах?
1. Перевести этот цикл на русский язык
В моем понимании:
1-2. начало цЫкла
3. задаем смещение
4. смещение во временную переменную
5. убираем смещение (зачем? для возвращения в начало?)
6. пихаем по адресу начала строки ее же, но начиная со смещения.
7. инкрементируем адрес(?)
8. конец цЫкла
9. формируем символ конца строки.

Тогда вопрос, если мне надо будет от 20-ти символьной строки отрезать первые 3 символа, не будет ли беды?

2. Как результат присвоить другой переменной?

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Выделение подстроки.

Сообщение gurvinok » 30 сен 2016, 15:45

for(BYTE i = 0; i < count; i++)
Бегаем в цикле столько, сколько нужно оставить символов.
str += start;
Смещаем указатель до начала нужной подстроки.
temp = *str;
Заносим во временную переменную символ.
str -= start;
Возвращаемся назад.
*str = temp;
Записываем символ в текущий массив.
str++;
Переходим к следующему символу.
Тогда вопрос, если мне надо будет от 20-ти символьной строки отрезать первые 3 символа, не будет ли беды?
Не будет. Пишем так.

Код: Выделить всё

substring(string_in, 3, ((sizeof(string_in)/sizeof(BYTE)) - 4));

Как результат присвоить другой переменной?
Никак. Функция не возвращает массивы. Можно передать функции указатель на массив, а внутри самой функции заполнить массив.
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: Выделение подстроки.

Сообщение kosmas » 30 сен 2016, 17:44

Код: Выделить всё

substring(string_in, 3, ((sizeof(string_in)/sizeof(BYTE)) - 4));
недопонял...

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Выделение подстроки.

Сообщение gurvinok » 30 сен 2016, 18:18

(sizeof(string_in)/sizeof(BYTE))
Получить количество всех элементов в массиве. Суммарное количество бит разделенные на количество бит типа массива.
(sizeof(string_in)/sizeof(BYTE)) - 4)
Отнять от количества элементов массива индекс начала плюс единица.То есть таким образом мы получили количество символов от начала отрезания до конца массива.
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: Выделение подстроки.

Сообщение kosmas » 03 окт 2016, 08:38

Вон оно чо, Михалыч... Век живи - и это не поможет...

Аватара пользователя
gurvinok
Сообщения: 1532
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Выделение подстроки.

Сообщение gurvinok » 03 окт 2016, 11:15

Ну как-то так. :roll:
Если долго мучиться, может быть получится.

Ответить