Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2007, 17:57   #1
kluwa
 
Регистрация: 04.12.2007
Сообщений: 3
По умолчанию РАБОТА СО СТРОКАМИ

Помогите, пожалуйста разобраться в обозначении!!!

char ss[2]={'\0','\0'};//первый символ слова

Скажите, почему так записывается первый символ слова и что вообще это значит?
kluwa вне форума Ответить с цитированием
Старый 19.12.2007, 18:01   #2
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Прогу целиком в студию, плз.
theos вне форума Ответить с цитированием
Старый 19.12.2007, 18:48   #3
1ntro
Пользователь
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

\0 -конец строки
\0 - начальный нулевой элямент вроде ) хз ) По идее так
1ntro вне форума Ответить с цитированием
Старый 19.12.2007, 18:57   #4
Alek86
Форумчанин
 
Регистрация: 25.09.2007
Сообщений: 189
По умолчанию

мало ли, что программист думал, когда это писал
возможно, 2 чара нужны для поддержки Unicode
а конструкция {'\0','\0'} - обычное "обнуление" массива
Alek86 вне форума Ответить с цитированием
Старый 19.12.2007, 21:45   #5
kluwa
 
Регистрация: 04.12.2007
Сообщений: 3
Восклицание

Цитата:
Сообщение от theos Посмотреть сообщение
Прогу целиком в студию, плз.

Выбрать из заданного текста предложения, все слова в которых образованы повторением одного символа и сформировать из них массив.

Код:
#pragma hdrstop

//---------------------------------------------------------------------------

#include <iostream.h>
#include <string.h>

//---------------------------------------------------------------------------

// Объявление класса для работы со строкой

class mystring {
	private:
		char *sourcetext;		// введённый текст
		int sourcelen;		// длина введённого текста
		char **strs;		// массив преобразованных предложений
		int nstrs;		// длина массива предложений
	public:
		mystring() {sourcetext = NULL; strs = NULL; sourcelen = nstrs = 0;}		// конструктор
		~mystring();		// деструктор
		void get(const char *text);		// ввод текста
		void transform();		// преобразование текста
		void print();		// вывод текста
};

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
	// Исходный текст
	char *text = "aaaaaa bbbbbbb cc.d eeeee fff.ggggggqgg";

	cout << text << "\n\n";

	mystring str;		// объект класса
	str.get(text);		// ввести исходный текст
	str.transform();	// преобразовать текст
	str.print();		// вывести преобразованный текст

	cin.get();		// показать результаты
	return 0;
}
//---------------------------------------------------------------------------

// Реализация класса для работы со строкой

mystring:: ~mystring() {
	delete[] sourcetext;		// удалить введённый текст
	for (int i = 0; i < nstrs; i++) {		// для каждого предложения из массива
		delete[] strs[i];		// освободить занимаемое место
	}
	delete[] strs;		// освободить место, занимаемое самим массивом
}

void mystring::get(const char *text) {
	sourcelen = strlen(text) + 1;		// длина вводимого текста
	sourcetext = new char[sourcelen];		// выделить место
	strcpy(sourcetext, text);		// скопировать текст
}

void mystring:: print() {
	for (int i = 0; i < nstrs; i++) {		// для каждого предложения из массива
		cout << strs[i] << "\n";		// вывести на экран
	}
}

void mystring::transform() {
	char *s1 = new char[sourcelen];		// очередное введённое предложение
	char *s2 = new char[sourcelen];		// и его копия
	char *beg, *end;		// начало и конец предложения
	int len;		// длина предложения
	char *s;		// очередное слово предложения
	int n = 0;		// количество подходящих предложений
	bool ok;		// признак "правильности" предложения
	char ss[2] = {'\0', '\0'};		// первый символ слова

	// Определить число предложений
	beg = sourcetext;
	while ((beg = strpbrk(beg, ".!?")) != NULL) {		// пока встречаются разделители предложений
		nstrs++;		// увеличивать счётчик предложений
		beg++;		// перешагнуть разделитель
	}
	char ch = sourcetext[sourcelen - 2];		// последний символ в тексте
	if (!((ch == '.') || (ch == '!') || (ch == '?'))) {		// если это не разделитель предложений,
		nstrs++;		// учесть последнее предложение
	}

	strs = new char*[nstrs];		// выделить место для массива предложений

	beg = sourcetext;		// начать с начала текста
	for (int i = 0; i < nstrs; i++) {		// обрабатывать все предложения по очереди
		end = strpbrk(beg, ".!?");		// найти конец очередного предложения
		if (end == NULL) {		// последнее предложение, не заканчивающееся разделителем,
			strcpy(s1, beg);		// скопировать его
		}
		else {		// предложение заканчивающееся разделителем
			len = end - beg;		// вычислить длину предложения (без разделителя)
			strncpy(s1, beg, len);		// скопировать предложение
			s1[len] = '\0';
			strcpy(s2, s1);
		}
		s = strtok(s1, " ");		// найти первое слово в предложении
		ok = true;
		do {
			ss[0] = s[0];
			if (strspn(s, ss) != strlen(s)) {		// если всё слово НЕ состоит из первого символа
				ok = false;		// "неправильное" предложение
				break;		// закончить его обработку
			}
		} while ((s = strtok(NULL, " ")) != NULL);		// пока находятся слова
		if (ok) {		// если предложение оказалось "правильным"
			strs[n] = new char[strlen(s2) + 1];		// выделить место в массиве
			strcpy(strs[n++], s2);		// и скопировать туда готовое предложение
		}
		beg = end + 1;	// перейти к началу следующего предложения
	}
	nstrs = n;
	
	// Освободить память
	delete[] s1;
}
Еще я не понимаю что означает
s1[len] = '\0'; и
ss[0] = s[0];
ПОЖАЛУЙСТА, ПОМОГИТЕ, ЗАВТРА ЗАЩИЩАТЬСЯ!

Модератор: Используйте тег <CODE>

Последний раз редактировалось merax; 22.12.2007 в 18:17.
kluwa вне форума Ответить с цитированием
Старый 20.12.2007, 00:04   #6
1ntro
Пользователь
 
Регистрация: 10.12.2007
Сообщений: 28
По умолчанию

s1[len] = '\0' - Завершающий символ ву строке
ss[0] = s[0] - в нулевой элемент строки сс помещают нулевой элемент строки с
1ntro вне форума Ответить с цитированием
Старый 20.12.2007, 15:25   #7
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Строки в С - массив типа char, с последним элементом, равным 0. Он означает конец строки (в независимости от того, сколько памяти выделено). Все стандартные функции, работающие со строками используют это.

1) s1[len] = '\0';
Ты копируешь часть строки из текста ( strncpy(s1, beg, len); ) - символы, чтобы s1 было строкой, надо в конце поставить 0. Это и делает данная строчка.

2) ss[0] = s[0];
В данном случае массив ss - это просто один символ. char ss[2]={'\0','\0'}; - ставится 0 в конце для того, чтоб ты мог работать с ним как со строкой. (отправлять пргументом в функции и пр.). Точно так же 'A' отличается от "A" тем, что 'A' - это просто char, а "A" - строка с завершающим 0, в которой всего один символ - 'A'. ("A" есть {'A',0})

Надеюсь понятно объяснил.
theos вне форума Ответить с цитированием
Старый 20.12.2007, 18:30   #8
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Цитата:
Сообщение от kluwa Посмотреть сообщение
ПОЖАЛУЙСТА, ПОМОГИТЕ, ЗАВТРА ЗАЩИЩАТЬСЯ!

--------------------------------------------------------------------------------
Последний раз редактировалось kluwa, Вчера в 21:50.
Мда... Я походу опоздал. ((
theos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками GoAnd Общие вопросы по Java, Java SE, Kotlin 9 22.09.2010 03:36
Работа со строками. ViNcHeStEr Помощь студентам 6 29.06.2008 08:14
С, работа со строками Надюха Помощь студентам 2 29.05.2008 13:07