LINUX.ORG.RU

Просьба проверить учебную программу на языке Си на наличие ошибок

 , ,


0

1

Исходный текст программы.

Указанная по ссылке заметка предназначена для людей, которые начинают изучать язык Си с использованием ОС GNU/Linux.
В случае обнаружения ошибок, недочетов в программе просьба сообщить.

Спасибо.

Deleted
Ответ на: комментарий от corjc

Смотря какие задачи, если важна скорость (к примеру ввод может быть и через пайп), то лучше чистый C.
Да сам я на C++ пишу, но не могу сказать, что он сильно лучше C. Слишком у него заморочек много и все его плюсы обходятся утратой скорости и легковесности ПО.

peregrine ★★★★★
()

функция prompt() перегружена вредным ей функционалом. По идее - её задача выдать приглашение к вводу, считать текст и его вернуть. Я бы ей даже добавил переменные параметры, чтобы формировать приглашение через vprintf и ему подобные, просто для удобства.

и опечалю - getline не везде есть :) раз уж всё равно тренируетесь, то делайте из prompt() его альтернативу, которая не только даёт приглашение к вводу, а заодно например жрёт(игнорит) лишние пробелы

проверка корректности полученной строки - другая тема, сейчас вам нужны буквы, в другой раз цифры, в третий раз корректная дата - надо выносить из prompt() в отдельную функцию

по поводу многобайтных кодировок - у вас всё равно кругом обычный printf, так что подразумевается либо ASCII либо UTF. Забей. Потом под настроение сделаешь отдельную wprompt по аналогии wprintf

что ещё по вашему коду..переменная «ssize_t read = 0;» это жезть...делать какие-либо free() перед exit вообщем-то ненужно

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от corjc

Что-что, а поток вывода в C++ в плане форматирования этого самого вывода - мрак жутчайший по сравнению с лаконичной форматной строкой printf и printf-like

kravich ★★★★
()

давай ещё другие творения разберем? учить, так учить http://www.aleksey.crimea.ua/xor.html

int count=0;
int i=0;
int textlen=0;
char cipherchar=0;
вне опредения функций, в.т.ч. main, переменные автоматом инициализируются нулем, поэтому не надо их самому инициализировать

Deleted
()
Ответ на: комментарий от Deleted

там же:

int i=0;
...
for(i=0; i<count; i++)
внимательнее надо быть

Deleted
()
Ответ на: комментарий от MKuznetsov

MKuznetsov, спасибо за подробный ответ.
Согласен с вашим мнением.

Deleted
()
Ответ на: комментарий от Deleted

Fermion

давай ещё другие творения разберем?

Ок.

Fermion

вне опредения функций, в.т.ч. main, переменные автоматом инициализируются нулем, поэтому не надо их самому инициализировать

там же:

int i=0;
...
for(i=0; i<count; i++)

+1

Deleted
()

http://www.aleksey.crimea.ua/xor.html

  if (textlen<KEYLEN) count=textlen;
    else count=KEYLEN;

Нехорошая конструкция, безопаснее для последующих изменений писать так:

if (textlen < KEYLEN)
{
    count = textlen;
}
else
{
    count = KEYLEN;
}

Я уже не говорю о преисподней глобальных переменных. Все критиковать не имеет смысла, лучше почитай «Совершенный код».

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Eddy_Em

Что за паническая боязнь goto? goto — очень полезная операция.

anonymous

может не боязнь, а отсутствие явной необходимости в данном случае? код с goto просто больше получается в данном случае.

anonymous, тоже так думаю.

Deleted
()
Ответ на: комментарий от Deleted

Ты учишь плохому же. Тот аноним показал, как можно обойтись без goto и без лавинообразного увеличения числа free в коде, но не имел в виду твой изначальный код в том месте, которое ты процитировал.

Ладно, знаешь, забей.

anonymous
()

аналог вашей prompt() - дарю :)

извините за длину paste и кривоватый английский в каментах..

size_t
ask(char **pbuf,size_t *psize,char *fmt,...) {
	char *s,*buf;
	size_t size;
	int c;
	int state;
	const size_t INC=16;
	// push char to local buffer
	void push(int c) {
		if (buf==NULL) {
			// need alloc
			size=INC;
			if ((s=buf=malloc(size))==NULL) abort(); // not exit()!! should signalled
		} else if (s==buf+size) {
			char *tmp;
			// need realloc
			if ((tmp=malloc(size+INC))==NULL) abort();
			memcpy(tmp,buf,size);
			s=tmp+(s-buf);
			free(buf);
			buf=tmp;
			size+=INC;
		}
		// push char
		*s++=c;
	}
	// check args
	if (pbuf==NULL || psize==NULL) {
		errno=EINVAL;
		return 0;	
	}
	s=buf=*pbuf;
	size=*psize;	// !! potential conflict size vs strlen(buf)
	// show prompt
	if (fmt!=NULL) {
		va_list ap;
		va_start(ap,fmt);
		if (vprintf(fmt,ap)<0) return 0; // errno sets by vprintf()
		va_end(ap);
	}
	// read chars and eat spaces
	state=' ';
	while((c=getchar())!=EOF && c!='\n') {
		// sample error recovering, req. only for syscalls
		if (c<0) {
			if (errno==EINTR) continue; // interrupted, try again
			else if (errno==EAGAIN) {
				sched_yield(); // temporary problem, may recover to next tick, try later
				continue;	
			}
			else break; // !recoverable error
		}
		// no errors on read
		errno=0;
		// eat-space FSM 
		if (state==' ') {	// skip blanks
			if (isblank(c)) continue;
			state='a';
			if (s!=buf) push(' ');
		} else if (isblank(c)) {
			state=' ';
			continue;
		}
		push(c);
	}
	// write \0 to non-empty string
	if (s!=buf)
		push(0);
	// save args
	if (pbuf) *pbuf=buf;
	if (psize) *psize=size;
	// return bytes writed to buf
	return s-buf;
}
странное пиво попалось - спать не хочется, серьёзным заниматься неможется, переключать рус/eng в редакторе лень

MKuznetsov ★★★★★
()
Ответ на: комментарий от Deleted

в случае textlen + k = KEYLEN, где k - натуральное число большее единицы, получаем шифр, последние (k-1) элементы результирующей последовательности которого будут созданы магией компилятора.

anonymous
()
Ответ на: комментарий от MKuznetsov

Писать на этом языке - не твоё. Уйди в пхписты, пж.

Вот мне всегда было интересно, что творится в твоей нулёвой породии на «думалку», когда ты пишешь такую хрень:

if (pbuf) *pbuf=buf;
if (psize) *psize=size;

Когда у тебя выше:

if (pbuf==NULL || psize==NULL) {
		errno=EINVAL;
		return 0;	
	}

s=buf=*pbuf;

На что ты надеешься? На радиацию? Почему же ты когда выше его разименовывал, то не проверял, а тут вдруг проверил? Т.е. на привычку сослатся не прокатит.

Логику в остальном даунистическом бреде я просто не способен понять.

За такие подарки надо в рожу плювать.

anonymous
()
Ответ на: комментарий от anonymous

anonymous

в случае textlen + k = KEYLEN, где k - натуральное число большее единицы, получаем шифр, последние (k-1) элементы результирующей последовательности которого будут созданы магией компилятора.

Если ключ длиннее открытого текста, текст будет зашифрован полностью, а ключ будет использован не в полном объеме.

Если ключ короче открытого текста, текст будет зашифрован не полностью, чтобы не допустить нежелательное повторное использование ключа.

Deleted
()
Ответ на: комментарий от anonymous

На что ты надеешься? На радиацию?

ты не прав. Потом автор забудет о верхней проверке, и вставит в код ещё что-то. Просто у тебя опыта маловато, и с тобой такого ещё не случалось.

emulek
()
Ответ на: комментарий от emulek

ты не прав.

О5 ты пытаешься со мною спорить, вопервых: в отличии от нулей - я не забываю. Когда я что-то меняю я переписываю всё, темболее в моей функции никогда не будет NULL по причине того, что я не нулёвый бомж как вы.

Потом автор забудет о верхней проверке, и вставит в код ещё что-то.

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

if (pbuf==NULL || psize==NULL) { // он удалит проверку тут
		errno=EINVAL;
		return 0;	
	}
s=buf=*pbuf;// И ПОЛУЧИТ СЕГФОЛТ ВОТ ТУТ, курочка ты моя

Просто у тебя опыта маловато, и с тобой такого ещё не случалось.

Ну конечно кукарекать про «опыт» ты можешь, а код читать нет. Это какраз показывает всю суть твоего «опыта». Опытом ваяния говна ты можешь только подтерется.

И да, со мною такого и не случится по причине того, что мой опыт и видение основанны на скилле и понимании, а не на курлыканье в курятнике.

anonymous
()
Ответ на: комментарий от anonymous

в отличии от нулей - я не забываю. Когда я что-то меняю я переписываю всё, темболее в моей функции никогда не будет NULL по причине того, что я не нулёвый бомж как вы.

с твоим гонором у тебя никогда не будет опыта работы. Только амбиции. А без опыта ты никому не нужен.

И ПОЛУЧИТ СЕГФОЛТ ВОТ ТУТ, курочка ты моя

и что? Это по твоему хорошо, да?

Ну конечно кукарекать про «опыт» ты можешь, а код читать нет.

это ты не можешь. Проверки тут для разного предназначены. Да, в данном случае они избыточны, но ничего страшного из-за них не случится.

И да, со мною такого и не случится по причине того, что мой опыт и видение основанны на скилле и понимании, а не на курлыканье в курятнике.

скилл и понимание у тебя есть, признаю. Но вот опыта у тебя нет, и не будет. До тех пор, пока ты хотя-бы не научишься общаться. Пока в ТВОИХ словах слово «петух» встречается в каждом предложении. Тебя в детстве изнасиловали что ли?

emulek
()
Ответ на: комментарий от emulek

с твоим гонором у тебя никогда не будет опыта работы. Только амбиции. А без опыта ты никому не нужен.

Ещё раз, мне не нужен опыть ваяния говна за еду. Я не притендую даже. Вот если я найду какое-то не говно за еду - так уж и быть - я подумаю над «опытом».

и что? Это по твоему хорошо, да?

Нет, это показывает тот факт, что ты даже не смотрел код. Пацан ставит проверки не из-за опыта, а форфан. Опыт на то и опыт, что он постоянен. А тут в одной строчки «опыт» есть, а в другой нет - это не опыт.

это ты не можешь.

Рили? Ну яж не зафейлился, а ты зафейлился.

Проверки тут для разного предназначены.

Причем тут проверки, если ты ставишь проверку перед разименованием - ты ставишь её везде, а не форфан. Если ты ставишь её форфан - у тебя нет оправдания, о котором кукарекаешь ты.

Да, в данном случае они избыточны, но ничего страшного из-за них не случится.

Ну в куче говна у тебя под стулом - тоже ничего страшного не случится, только вот ты не хочешь говна под собою, а с чего я должен хотеть видеть это говно везде?

Они не избыточны - они просто не имеют смысла.

скилл и понимание у тебя есть, признаю.

Месяц назад ты кукарекал совершенно обратное, мб через месяцок-другой ты так же будешь кукарекаеть про опыт.

Ты присмотрить и подумай почему твои суждения настолько быстро меняются. Ты молодец, что они меняются, но ты должен признать и то, что твоё мнение не стоит ничего, ибо оно почти всегда не верно и состоит из стандного рефлекса.

Почему ты считаешь, что твоё понимание верно? Понимание питухов тебя окружающих тоже? Всё в этом мире служит оправданием анскилла. Он поставил проверки, ибо он нулёвый и только по этой причине. Но ты пытаешься его оправдать, ибо ты делаешь тоже самое - ты в нём видешь себя и у тебя бомбит.

Но вот опыта у тебя нет, и не будет. До тех пор, пока ты хотя-бы не научишься общаться. Пока в ТВОИХ словах слово «петух» встречается в каждом предложении. Тебя в детстве изнасиловали что ли?

Мне не нужен твой опыт, ещё раз. У тебя нет понимания и ведения - какого хрена ты кукарекаешь о чём-то?

В твоём случае опыт - это ваять говно. Мне ваять говно не нужно.

Пока в ТВОИХ словах слово «петух»

Питух. И питух в нормальном его понимании, а не зековском. Питух - это такая хрень с гребешком, которая кукарекает громче всех. Кукарекает ради кукаретинга. Чтобы обратить на себя внимание других питушков.

anonymous
()
Ответ на: комментарий от anonymous

Причем тут проверки, если ты ставишь проверку перед разименованием - ты ставишь её везде, а не форфан. Если ты ставишь её форфан - у тебя нет оправдания, о котором кукарекаешь ты.

какой ты упорытый. Ты не только код «смотри», ты ещё голову включай: pbuf это внешняя переменная, там всё, что угодно будет. Если там NULL, то эта версия кода вернёт EINVAL(в errno, что не слишком хорошо ИМХО, ну ладно). Однако. Следующая версия может быть как то будет вести себя иначе, сама обрабатывать pbuf, если ей NULL дать. Естественно сохранять «в NULL» ничего не надо будет в данном случае.

Месяц назад ты кукарекал совершенно обратное, мб через месяцок-другой ты так же будешь кукарекаеть про опыт.

у меня сегодня хорошее настроение.

Ты присмотрить и подумай почему твои суждения настолько быстро меняются. Ты молодец, что они меняются, но ты должен признать и то, что твоё мнение не стоит ничего, ибо оно почти всегда не верно и состоит из стандного рефлекса.

детка, меняется моё мнение О ТЕБЕ. Оно да, субъективно. А вот мнение о коде — увы. Если я сегодня сказал «говнокод», то я и завтра так считать буду.

Почему ты считаешь, что твоё понимание верно? Понимание питухов тебя окружающих тоже? Всё в этом мире служит оправданием анскилла. Он поставил проверки, ибо он нулёвый и только по этой причине. Но ты пытаешься его оправдать, ибо ты делаешь тоже самое - ты в нём видешь себя и у тебя бомбит.

да ничего у меня не «бомбит». Мне насрать. Аффтор кода мне ничего не должен, как и я ему. Я тебе сейчас объясняю то, что ты за своим ЧСВ понять не в состоянии.

В твоём случае опыт - это ваять говно. Мне ваять говно не нужно.

а мне — нужно. Ну что поделать...

Питух. И питух в нормальном его понимании, а не зековском. Питух - это такая хрень с гребешком, которая кукарекает громче всех. Кукарекает ради кукаретинга. Чтобы обратить на себя внимание других питушков.

а ты зачем кукарекаешь в разы громче меня?

emulek
()
Ответ на: комментарий от emulek

какой ты упорытый. Ты не только код «смотри», ты ещё голову включай: pbuf это внешняя переменная, там всё, что угодно будет. Если там NULL, то эта версия кода вернёт EINVAL(в errno, что не слишком хорошо ИМХО, ну ладно).

И? Если так ниже pbuf не меняется и значит он всегба дует валидным.

Однако. Следующая версия может быть как то будет вести себя иначе, сама обрабатывать pbuf, если ей NULL дать. Естественно сохранять «в NULL» ничего не надо будет в данном случае.

Она и сейчас его обрабатывает, тупорылая ты макака. И без разницы как - код ниже либо валидируется, либо не исполняется, либо сегфолтится.

Ещё раз для дауна В коде может быть 2 состояния: а) нула быть не может и б) нул быть может.:

  s=buf=*pbuf;//состояние а - тут не может быть сегфолта, состояние б - может.
  size=*psize;//тут тоже.
  if (pbuf) *pbuf=buf;//состояние а - код не имеет смысла не только из-за того, что проверка бесмысленно и если там нулл - сегфолт будет ещё до неё, а и из-за несоблюдения какой-то общей стилистики. Состояние б - сегфолта не будет.
  if (psize) *psize=size;

Что ты мне рассказать хочешь, ссань недотоптанная?

anonymous
()
Ответ на: комментарий от emulek

у меня сегодня хорошее настроение.

До, до.

детка, меняется моё мнение О ТЕБЕ. Оно да, субъективно. А вот мнение о коде — увы. Если я сегодня сказал «говнокод», то я и завтра так считать буду.

У тебя не может быть мнения о коде - ты нулёвая бездарность. Чтобы у тебя было какое-то внятно мнение о чем-то - ты должен обладать какой-то базой, на котой строится твои система оценок.

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

да ничего у меня не «бомбит». Мне насрать. Аффтор кода мне ничего не должен, как и я ему. Я тебе сейчас объясняю то, что ты за своим ЧСВ понять не в состоянии.

Бомбит - ты нищая макака, как собственно и автор кода. Ты подсознательно понимаешь, что ты написал такое же говно - ты ассоциируешь себя с этим питухом. И ты пытаешься оправдаться не за того питуха, а за себя.

Вся суть в том, что это говно. И ты говно. И вместо того, чтобы в этом признаться и пытаться писать нормально - ты оправдываешься как обсосок.

Я сужу не ЧСВ"ом, а скиллом. А вот ты судишь ЧСВ"ом, ибо ты пытаешься оправдать говно, а оправдать ты его хочешь по причине того, что ты напишешь такое же говно. А ЧСВешник не может признать того, что его выхлоп говно - вот и прут оправдания.

а мне — нужно. Ну что поделать...

А мне на это покласть. Это нужно тебе, а не мне, а не коду, а не миру. Тебе, нулёвому бомжу, нужно сосуществовать с нулёвыми бомжами и ваять говно за еду. Только это нужно лишь тебе - заруби это себе на своём носу. И даже не упоминай это в приличном обществе.

а ты зачем кукарекаешь в разы громче меня?

Нет, я не кукарекаю - я говорю. За моими словами стоит мой скилл понимание, которого у питушков нету.

anonymous
()
Ответ на: комментарий от anonymous

Она и сейчас его обрабатывает, тупорылая ты макака. И без разницы как - код ниже либо валидируется, либо не исполняется, либо сегфолтится.

ну это сейчас. Что будет завтра — hz.

Ещё раз для дауна

не тупи: я про то, что функция может быть изменена _в_ _будущем_.

emulek
()
Ответ на: комментарий от anonymous

Бомбит - ты нищая макака, как собственно и автор кода. Ты подсознательно понимаешь, что ты написал такое же говно - ты ассоциируешь себя с этим питухом. И ты пытаешься оправдаться не за того питуха, а за себя.

ты прям как студент третьекурсних психфака кукарекуешь...

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.