Форум программистов, компьютерный форум, киберфорум
Наши страницы

Обработать строки, пользуясь указателями - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Компилятор для новичка http://www.cyberforum.ru/cpp-beginners/thread687781.html
будь ласка, дайте (порекомендуйте) компилятор, которым пользуетесь, для новичка, у меня установлен: rad studio, vs studio 2012, vs studio 2010, vs studio, 2008 Turbo C.
C++ Почему не определяются cout, cin, endl, system? int i,n,k1,k2; float min,s=0; cout<<" n="; cin>>n; float* a=new float ; cout<<" Enter elements: "; for(i=0;i<n;i++) cin>>a; min=a; for(i=1;i<n;i++)... http://www.cyberforum.ru/cpp-beginners/thread687764.html
Нарисовать, эллипс движущийся по координатам, с помощью таймера C++
при помощи таймера пытаюсь нарисовать эллипс движущийся по координатам fx=0; fy=-mas*g; vx=vx+fx*time/mas; vy=vy+fy*time/mas; ...
Вычислить сумму элементов массива, расположенных между первым и последним положительными элементами C++
#include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { int i,j, n; int numMaxFirst, count=0, summ=0; int *arr; printf("Enter numbers: "); // вводим...
C++ из int в string http://www.cyberforum.ru/cpp-beginners/thread687720.html
объясните ,пжлста, где ошибка. собственно задание такое: Enter one real and one integer number: 2.71828183 1392 The real is: _ _ _ _ _ _2.718 The integer is: _ _ _ _1392 я перевожу в string,...
C++ Работа с файлами и цветом в консоли всем привет ..есть задание..проблема с первым пунктом,а точнее с его отображением в консоли как вывести так как есть в файле? и по возможности объяснить как написать 2 и 3 часть задания. С... подробнее

Показать сообщение отдельно
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
04.11.2012, 16:41
Для начала определимся что есть что
cur и sht это указатели на символ в тексте.
Присваивая cur=text, мы указываем указателем на первый символ текста
увеличивая указатель на единицу(или на любое число), мы двигаем его по тексту вперёд на соотв. количество букв, первая буква, вторая и.т.д.
*cur и *sht - это значения символов, на которые указывают эти указатели (т.е. собственно буквы 'a' 'b' 'c'...)
Если их увеличивать/уменьшать, указатель никуда не сдвинется, а будет изменятся сама буква на этом месте.
Особая буква(символ) это 0. Не текст в кавычках '0', а число 0. Этот символ должен всегда стоять в конце строки, собственно конец строки по другому определить и невозможно.
Именно поэтому, чтобы проверить весть текст от первого до последнего символа, мы задаём цикл

C++
1
2
3
4
5
cur=text;//указатель на текущий символ указывает на первый
while(*cur){//пока *cur (значение текущего символа) не равен нулю, т.е. признаку конца строки
/*проверка текущего символа*/
cur++;//передвижение указателя на 1 символ вперёд, на следующий символ
}
Теперь в цикле нужно не просто перемещать указатель от первого до последнего символа, но и проверять их на необходимость удвоить
Эту проверку выполняет условие if (*cur==c)
*cur это текущий символ, который расположен в месте куда указывает указатель cur (указатель текущего символа).
Если он равен тому, что надо удвоить, выполняется блок удвоения символа.
Что такое удвоение символа? Написать в следующей за cur позицией такой же символ с? Скажем *(cur+1)=c?
Э нет!
Если просто написать на следующем за ним месте такую же букву, то она затрёт букву, что была в тексте на этом месте, и та потеряется.
Поэтому перед тем как удвоить символ, необходимо сдвинуть всю часть текста, следующую за ним
на 1 позицию вправо, и только потом вписывать символ в освободившееся место.
как это происходит? Мы должны снова пройтись по тексту в цикле до конца, заменяя каждую букву на ту, что раньше стояла перед ней, а последнюю букву добавить в конец.
Но мы проходим в цикле не сначала, а начиная с символа с которого начинаем двигать.
Цикл аналогичен главному циклу, который проходит по тексту, только используется указатель не cur, а новый (я назвал его sht)
Цикл выглядит так:
C++
1
2
3
4
5
sht=cur+1;
        while(*sht){
          //двигаем один символ
          sht++;             
        }
Аналогично, не правда ли? Остаётся понять, что значит "двигаем один символ"? Это значит, что мы заменяем символ по указателю sht на предыдущий.
Что может быть проще? Сделаем *sht=*(sht-1) и дело с концом. Но не всё так просто. При таком действии мы не только затрём символ, на который указывает sht,
но и будем копировать этот символ и в следующей итерации цикла, заполнив весь текст одинаковыми символами.
Поэтому, надо всегда сохранять тот символ, что ранее был на месте sht во вспомогательной переменной r
перед тем как затирать его предыдущим сохранённым таким образом символом в операции *sht=r; Более того, необходимо сохранять не только предыдущий но и текущий символ,
потому что *sht=r; как уже замечено ранее затрёт бывший в этом месте символ.
Поэтому операция разбивается на 4 части
C++
1
2
3
4
5
6
//шаг № n
h=*sht; // текущий символ сохраняем в h, чтобы не затёрся, 
*sht=r;  //т.к. на его место встаёт предыдущий символ  
/// готовимся перейти к шагу № n+1
r=h;      // предыдущий символ теперь это тот, который был текущим
sht++;   // а текущий это следующий за ним.
Когда закончится цикл while(*sht), сдвигающий текст sht будет указывать на конечный символ 0
а последним значимым символом в тексте станет бывший предпоследний
Было
sht--------------v
cur-----------v
'у' 'к' 'а' 'з' 'а' 'т' 'е' 'л' 'ь' 0
Стало
h=r='ь'
sht---------------------v
cur-----------v
'у' 'к' 'а' 'з' 'а' 'т' 'т' 'е' 'л' 0

поэтому необходимо записать на место, указывааемое sht последний символ (он сохранился в процессе последней итерации цикла в переменных r и h)
*sht=r;
sht---------------------v
'у' 'к' 'а' 'з' 'а' 'т' 'т' 'е' 'л' 'ь'
и поставить в конец затёртый нами нулевой символ конца строки, увеличив тем самым её длину на 1
sht++;
*sht=0;
sht------------------------v
cur-----------v
'у' 'к' 'а' 'з' 'а' 'т' 'т' 'е' 'л' 'ь' 0

Ну и перед выходом из условия проверки надо ещё раз увеличить cur, потому что в главном цикле он кинется проверять следующую букву, а она уже удвоена, поэтому двигаем его дополнительно на единицу
C++
1
cur++
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru