Страница 1 из 2
объясните программу
Добавлено: 16 июн 2009, 20:17
nikitoz_ru
Добрые люди объясните пожалуйста программу можно по строчно:
Код: Выделить всё
#include <iostream.h>
int main()
{
cout << "\stroka: ";
const int lineLength = 256;
char *lineBuffer = new char[lineLength];
memset(lineBuffer,0,lineLength);
char *resultBuffer = new char[lineLength];
memset(resultBuffer,0,lineLength);
const char *p = lineBuffer;
char *pr = resultBuffer;
cin >> lineBuffer;
for (; p; p += 2)
{
if (*p != '\0')
*pr++ = *p;
else break;
}
p = lineBuffer;
++p;
for (; p; p+=2)
{
if (*p != '\0')
*pr++ = *p;
else break;
}
cout << "\nResult: " << resultBuffer << '\n';
return 0;
}
Re: объясните программу
Добавлено: 18 июн 2009, 10:32
BBB
Похоже на "вывести в результирующую строку сначала все четные, а затем все нечетные символы исходной строки".
Только код кривой. Если длина исходной строки нечетная, то первый цикл (формально) окажется бесконечным. Если четная, то второй цикл.
Re: объясните программу
Добавлено: 18 июн 2009, 12:36
Romeo
Цикл бесконечный и в первом и во втором случае. Чтобы работало правильно, в цикле вместо
p следует написать
*p. Вот так:
.
Добавлено: 18 июн 2009, 15:39
BBB
Romeo писал(а):Цикл бесконечный и в первом и во втором случае. Чтобы работало правильно, в цикле вместо
p следует написать
*p. Вот так:
Отнюдь не бесконечный в ОБОИХ случаях. Если
lineBuffer - это null-терминированная строка, то либо в первом, либо во втором случае условие
if (*p != '\0') НЕ выполнится, а по
else там стоит break из цикла.
Более того, замена во второй "позиции" цикла for
p на
*p абсолютно ничего не изменит. Так как первым же действием внутри цикла стоит ровно то же самое. А именно, проверка значения байта, на корорый указывает в данный момент
p на ноль.
Хотя, писать
p, конечно, бессмысленно. В том смысле, что значение этого "выражения" всегда будет TRUE.
Re: объясните программу
Добавлено: 18 июн 2009, 15:55
Romeo
Мммм, да, каюсь, невнимательно прочитал что внутри цикла стоит. У меня взгляд уцепился за аномалию в условии и тут же возникло желание поведать об этом всем
Зато я заметил, что вот такого там нет:
" писал(а):Если длина исходной строки нечетная, то первый цикл (формально) окажется бесконечным. Если четная, то второй цикл.
Дело в том, что там делается memset, так что в конце строки не один нуль, а множество и, как следствие, нуль есть и на чётной и на нечётной позиции
А вообще неграмотный код зло, он достаточно часто сбивает опытных программистов с толку, если пытаться читать его быстро, не заостряя внимания на мелочах, в то время как быстрое чтение грамотного кода не доставляет никаких проблем.
Re: объясните программу
Добавлено: 18 июн 2009, 16:33
BBB
Romeo писал(а):Дело в том, что там делается memset, так что в конце строки не один нуль, а множество и, как следствие, нуль есть и на чётной и на нечётной позиции
Да, на memset я особого внимания не обратил.
Но все равно это ненадежно. В случае краевого эфекта (длина строки окажется равна
sizeof (...) - 1), там (в конце) окажется только один ноль. В случае еще бОльшей длины строки, как я понимаю,
cin >> lineBuffer уже исполосует память за строкой.
Да в вообще, если это в самом деле такой "тонкий расчет", то уж как-то слишком хитрО это... Я бы вот так циклы написал:
Код: Выделить всё
...................
while (TRUE) {
if (*p != '\0')
*pr++ = *p;
else break;
p++;
if (*p == '\0')
break;
p++;
}
p = lineBuffer;
while (TRUE) {
if (*p == '\0')
break;
p++;
if (*p != '\0')
*pr++ = *p;
else break;
p++;
}
Может, писанины чуть длинее, но зато без хитрых выкрутасов, над которыми (через некоторое время) придется голову ломать при попытке понять, а как же это все тут работает?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вообще, еще проще, пожалуй, определить перед циклами длину исходной строки и ориентироваться на нее, а не на встречу в строке нулевого символа. Тогда вообще не будет опасности "проскочить дальше", даже в случае инкремента текущей позиции в строке на два. Ведь условие быхода из циклв будет неравество, где сравнивается текущая позиция с длиной строки.
Re: объясните программу
Добавлено: 19 июн 2009, 15:05
nikitoz_ru
может кто нибудь исправит код чтоб не было:
Код: Выделить всё
char *lineBuffer = new char[lineLength];
memset(lineBuffer,0,lineLength);
char *resultBuffer = new char[lineLength];
memset(resultBuffer,0,lineLength);
а было просто
короче без =new char[lineLength] и lineLength вобще не нужен
я пробовал не получается
Re: объясните программу
Добавлено: 19 июн 2009, 15:29
Romeo
Код: Выделить всё
char lineBuffer[lineLength] = {0};
char resultBuffer[lineLength] = {0};
Без lineLength совсем нельзя. Иначе не понятно какого размера должен быть буфер.
Re: объясните программу
Добавлено: 19 июн 2009, 19:13
nikitoz_ru
Cделал как ты сказал у меня комп повис))
мне вообше нужно написать программу через указатели строки. Чтобы все было ясно вот текст:
Описать функцию, которая изменяет заданную строку следующим образом: сначала записывает все элементы с четными индексами, а затем все элементы с нечетными индексами ( с сохранением их относительного порядка в каждой группе). Например, abcdefgh => acegbdfh, vwxyz => vxzwy.
эта прога была без указателей написана через char linbuffer; а нужно так: char *linebuffer;
Re: объясните программу
Добавлено: 22 июн 2009, 09:45
Romeo
Так, как хочешь ты, сделать нельзя. В любом случае нужно указать каков размер буфера. А будет выделяться буфер в куче (через new) или на стеке (локальный массив) - это уже второй вопрос: дела он не касается и в задании способ выделения тоже не оговорен.
Почему у тебя компьютер завис я не знаю. Только что проверил твой вариант у себя на машине на 6-й студии - всё работает.