LINUX.ORG.RU

С: что за бред?


0

0

Без этой строчки всё работает:
unsigned int n_of_words = 0;

С ней же scanf вообще не работает:
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)
Please enter a word to save: (null)


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

// Программирование в Linux
// realloc() изменение размера
//
// Автор: Антон Кузьмин (selecter на gmail.com)
//------------------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
	unsigned int n_of_words = 0;
	char *word;
	/*struct words {
		char *word;
	} *word_set;*/

	/*word_set = (struct words *) malloc(2 * sizeof(*word_set));
		
	if(word_set == NULL)
	{
		printf("Error allocating memory...\n");
		return 1;
	}*/
	
	printf("Storage bot...\n");
	printf("Please enter a word to save: ");
	while( scanf("%s", word) != EOF )
	{
		/*
		word_set[n_of_words].word = word;
		printf("%s\n", word_set[n_of_words].word);
		n_of_words++;
		*/
		printf("%s\n", word);
		printf("Please enter a word to save: ");
	}
	return EXIT_SUCCESS;
}
★★★★

Рекомендую почитать учебники по Си в разделах указателей и выделения памяти. В данной конкретной "программе" scanf помещает прочитанные данные в случаное место памяти, поэтому ее поведение неопределено и может зависеть от чего угодно.

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

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

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

Хм... спасибо. Понял.

$ ./05-realloc
Memory allocated: 20 bytes
Storage bot...
Please enter a word to save: first
Please enter a word to save: second
Memory allocated: 40 bytes
Please enter a word to save: third
Please enter a word to save: fourth
Memory allocated: 80 bytes
Please enter a word to save:
first
second
third
fourth

>присутствовать также и в форматной строке scanf

Вот только этого мне не удалось сделать

Вот код:
//------------------------------------------------------------------------------

// Программирование в Linux
// realloc() изменение размера
//
// Автор: Антон Кузьмин (selecter на gmail.com)
//------------------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>

extern int strcpy();

struct words {
	char word[10];
} *word_set;

const size_t WORD_SIZE = sizeof(*word_set);
unsigned int allocated = 1;

void expand()
{
	allocated *= 2;
	word_set = (struct words *) realloc(word_set, allocated * WORD_SIZE);
	if(word_set == NULL)
	{
		printf("Error allocating memory...\n");
		exit(1);
	}
	printf("Memory allocated: %d bytes\n", allocated * WORD_SIZE);
}

int main(int argc, char *argv[])
{
	unsigned int n_of_words = 0;
	char word[10];

	expand();	
	printf("Storage bot...\n");
	printf("Please enter a word to save: ");
	while( scanf("%s", &word) != EOF )
	{
		strcpy(word_set[n_of_words].word, word);
		if(++n_of_words == allocated) expand();
		printf("Please enter a word to save: ");
	}
	printf("\n");
	
	int i;
	for(i=0; i<n_of_words; i++)
	{
		printf("%s\n", word_set[i].word);
	}
	return EXIT_SUCCESS;
}

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

> Нет в этом необходимости

Отлично. Отныне я буду игнорировать твои вопросы. Советую остальным то же.

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

Успокойся. Я и так знаю, что массивы по ссылке передаются. А книгу не надо, т.к. всё в гугле есть. Впрочем, перед таким гордым человеком, как ты, не хочется оправдываться.

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

2Selecter:

> А книгу не надо, т.к. всё в гугле есть.

Судя по:

>>присутствовать также и в форматной строке scanf

>Вот только этого мне не удалось сделать

все ж, без книги не обойтись...

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

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

Die-Hard ★★★★★
()

Антошка, тебе уже столько раз на все лады советовали не связываться с Си, а ты всё продолжаешь суходрочку?

anonymous
()

ужоснах. иди подучи Си лучше и почитай стандарты C и к куче C++. Года через 2 можно начинать писать уроки. А то научишь детишек...

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

Keiko, ты бы хоть не лез. Тебя обосрали, решил на другого переложить? http://www.linux.org.ru/jump-message.jsp?msgid=1151461

Основы С++ я уже выучил, можно сказать. А, вот с костылями Си я не знакомился. Впрочем я не удивлён, что на ЛОР-е есть такая тенденция унижать других, чтобы себя возвысить.

P.S. В ПОСЛЕДНИЙ РАЗ "ОПРАВДЫВАЮСЬ". УЖЕ НЕТ СИЛ. С другой стороны - шавка лает, караван идёт.

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

>Основы С++ я уже выучил, можно сказать.
>А, вот с костылями Си я не знакомился.

Работа с указателями в С ничем не отличается от С++. Хотя, конечно, С++ многое тебе не разрешает делать [без явного приведения типов], чем и разжижает твой мозг - ты надеешься на язык, а язык С, в отличии от С++, разрешает стрелять себе по ногам гораздо чаще.

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

> язык С, в отличии от С++, разрешает стрелять себе по ногам гораздо чаще.

Зато у С++ поражающая способность больше.

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

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

>>Keiko, ты бы хоть не лез. Тебя обосрали, решил на другого переложить?

Ха-ха, а где там обоср-то ? :))) Пожалуй, это ты перекладываешь на другого, то бишь меня. Тебе уже не раз указывали на то, что ты не знаешь даже основ, типа применения inline или того же scanf, а ты всё лезешь с уроками. Представляешь чему могут научиться детки по таким урокам ? Не обижайся, но тебе реально надо бы проштудировать книжки сначала, а не лезть на ЛОР с вопросами как на Си строки считывать. А то "караван"... "караван"...

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

1. размер буфера scanf'у укажи, чтоб переполнение не случилось scanf("%9s", word); 2. что такое &word? должен быть указатель на начало массива, а это &word[0] или word

в общем купи себе http://www.ozon.ru/context/detail/id/2480925/ или http://www.ozon.ru/context/detail/id/966202/ чтоб идиотские вопросы больше не задавать

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

>extern int strcpy();

а это нахера? #include <string.h> религия сказать не позволяет?

потом указатель word_set не проинициализирован...

в общем ужас

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

>Нет в этом необходимости

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

кстати в Си++ тоже без книжки вникал?

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

обратите внимание, как метко автор выбрал тему поста...

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