Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Работа со строками. Буфер содержит нуль-терминатор

Ответить
Настройки темы
C/C++ - [решено] Работа со строками. Буфер содержит нуль-терминатор

Аватара для Dr.Dark

Старожил


Сообщения: 224
Благодарности: 15

Профиль | Отправить PM | Цитировать


Есть буфер (char[512]), в котором текст разделённый \0. Нужно разбить на строки буффер и записать в массив. Как это правилнее в C++ сделать?! Пока придумал вариант в цикле посимвольно просматривать буфер и писать символы в массив при встрече с '\0' создавать новый элемент в массиве. Но чот мне кажется что решение из арсенала индийских прогеров.... Есть еще strchr... Но она возвращает указатель на элемент... а без индекса не знаю как извлечь из строки подстроку... В общем помогите плз найти оптимальное решение...

-------
Спасение утопающих-дело рук самих утопающих.


Отправлено: 16:07, 28-08-2010

 

Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Первое, что пришло в голову:
Код: Выделить весь код
char buf[] = "aaaa\0bbbb\0cccc\0";
char result[1024];
char *ptr;
int offset, len;

offset = 0;
len = sizeof(buf);
while(len != offset)
{
        ptr = strchr(buf + offset, 0);
	strncpy(result, buf + offset, (int)(ptr - buf) + 1);
	offset += (int)(ptr - (buf + offset)) + 1;
	cout << result << endl;
}
getch();
return 0;

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:03, 28-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Dr.Dark, если наперёд известно количество подстрок (в примере ниже 23) то можно поступить следующим образом:
Код: Выделить весь код
char Label [512] = "Раз\0Два\0Три\0....";
int SubStrLen = 0;
for (int i = 0; i < 23/*36*/; i++)
{
	//Доступ к подстроке будет как &Label[SubStrLen]
	SubStrLen += strlen(&Label[SubStrLen]) + 1;
}
Воспользовавшись предложением от ganselo, в части sizeof, можно обойтись от указания конкретного числа в цикле, однако на момент компиляции строка уже должна быть сформирована (прописана в коде).
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:18, 29-08-2010 | #3


Аватара для Dr.Dark

Старожил


Сообщения: 224
Благодарности: 15

Профиль | Отправить PM | Цитировать


ММММ Всем спасибо.... уже сделал так
Код: Выделить весь код
char *sArr, INI[512], *ptr, *lptr;

//запись в буфер INI[512]

lptr=INI;
while(*lptr!=*(lptr-1))
{   
ptr=strchr(lptr,'\0');
sArr=(char*) malloc(ptr-lptr+1);
strncpy(sArr, lptr, ptr-lptr+1);
lptr=ptr+1;
cout <<"sArr :" << sArr <<"\n\r";
cout <<"sArr :" << ptr-INI <<"\n\r";
system("pause");
}
ganselo твой метод не подходит тем что если буфер не полный то результирующий массив будет забиваться хламом в виде нолей или ещё чего.... можешь проверить... напиши
Код: Выделить весь код
char buf[] = "aaaa\0bbbb\0cccc\0\0\0\0\0\0";
и увидишь что лишние нули будут в result...

Admiral Увы количество подстрок не известно...

Относительно функциональности правильно. А вот относительно идеологии C++? Подскажите всё ли правильно?!
И ещё подкиньте что нибудь толковое о динамических многомерных массивах в C++... Гугл уже юзаю....

-------
Спасение утопающих-дело рук самих утопающих.


Последний раз редактировалось Dr.Dark, 29-08-2010 в 03:58.

Это сообщение посчитали полезным следующие участники:

Отправлено: 03:43, 29-08-2010 | #4


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


Цитата Dr.Dark:
ganselo твой метод не подходит тем что если буфер не полный то результирующий массив будет забиваться хламом в виде нолей или ещё чего.... можешь проверить... напиши
Код:
char buf[] = "aaaa\0bbbb\0cccc\0\0\0\0\0\0";
и увидишь что лишние нули будут в result... »
можно сделать проверку if(strlen(result) != 0) { }

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:53, 29-08-2010 | #5


Аватара для Dr.Dark

Старожил


Сообщения: 224
Благодарности: 15

Профиль | Отправить PM | Цитировать


ganselo, точно... ток в цикле
Код: Выделить весь код
while(*lptr!=NULL)

-------
Спасение утопающих-дело рук самих утопающих.


Отправлено: 16:13, 29-08-2010 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Работа со строками. Буфер содержит нуль-терминатор

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - [решено] Работа с строками crashtuak Программирование и базы данных 16 26-03-2009 01:21
CMD/BAT - [решено] Работа со строками в cmd-файлах melato Скриптовые языки администрирования Windows 3 30-01-2007 08:52
Нуль модем Roman Go Хочу все знать 4 30-11-2002 01:19




 
Переход