LINUX.ORG.RU
ФорумTalks

[оффтопик][gcc][MinGW]Шозанах? О_о

 , ,


0

0

Имеется примитивная программа, вот кусок кода:

struct student{
	char name[12];
	char surname[12];
};
	struct student stud[100];
	int amt=1;
	char choice;
	do {
		
		printf("Student #%d.\n",amt);
		printf("Enter name: ");
		scanf("%12s", &stud[amt].name);
		printf("Enter surname: ");
		scanf("%12s", &stud[amt].surname);
		printf("Do you want to add another student? [y/n]");
		scanf("%1s",&choice);
		amt++;
	} while (choice!='n');

При сборке Borland C++ Compiler 5.5.1 всё работает нормально, при сборке gcc из MinGW-3.4.5 при каждой итерации цикла значение amt не меняется и остаётся равным 1. Вопрос - шозанах? О_о

З.Ы. В толксы, т.к. оффтопик. Оффтопик, т.к. для инста. Да, Си я не знаю.

★★★★
Ответ на: комментарий от Ramen

>Не очень понял, при чём здесь может быть это, но попробовал - не помогло.

оптимизация?

z0D5e8n7x
()

Подозрение что последний scanf("%1s",&choice) затирает память amt в ноль. Поставьте после него printf("amt = %d", amt).

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

>Подозрение что последний scanf("%1s",&choice) затирает память amt в ноль. Поставьте после него printf("amt = %d", amt).

Да, это действительно так, спасибо.
Только возникло два вопроса: почему и как исправить?

Ramen ★★★★
() автор топика

Хотя растыканый fflush(stdin) перед каждым scanf и замена
scanf("%1s",&choice);
на
scanf("%c",&choice);
Помогли. Но вопрос почему остался. Также мучает вопрос почему оно в BCC собирается нормально и без этого.

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

Потому что:

s String of characters. This will read subsequent characters until a whitespace is found (whitespace characters are considered to be blank, newline and tab).

Строка символов - это как минимум 2, последний будет 0. Памать переменных в стеке получилась так, что amt идёт сразу за choice и ноль записался в первый байт amt.

Правильно:

char choice[2];

scanf("%1s", choice);

if (choice[0] == 'n') ...

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

Строка завершается нулевым символом, который вылазит за пределы отведённой под 1 char области.

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

Борланд просто по другому переменные в стеке разместил и мусор записался в другое место. Так что ошибка не вылезла наружу. Это не отменяет факт ошибки в коде.

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

> Понятно, спасибо. Тогда %12s тоже нужно заменить на %11s?

Да. Или увеличить размер массива на 1.

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

Бл*ть! И совсем безмозглый кретин делает цикл с ручной итерацией переменных :(

P.S. и это ЛОР... 2008-го года, йопт... :(((

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

>Понятно, спасибо. Тогда %12s тоже нужно заменить на %11s?

Нет конечно. на %с. И вообще лучше на getchar(), только для хранения возвращаемого значения нужен int.

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

Да, закончились дельные посты - начался унылый троллинг.

Гарик, как же ты мог забыть, что си вообще не нужен? (:

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

> Да, закончились дельные посты - начался унылый троллинг.

Это ЛОР, сынок. Щдесь троллинг начинается ещё до самого топика, в отличие от унылого двача ;)

> Гарик, как же ты мог забыть, что си вообще не нужен? (:

Си как раз нужен, не нужны си-плюс-плюс и прочие новомодные извращения.

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

> Бл*ть! И совсем безмозглый кретин делает цикл с ручной итерацией переменных :(

Нк здесь понятно - удобнее было бы через for, а

> Только конченый идиот ставит *scanf() в конце цикла.


в чем ошибка здесь? Или имелось ввиду:

for(amt = 1; choice != 'n'; amt++, scanf("%c", &choice))

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

>for(amt = 1; choice != 'n'; amt++, scanf("%c", &choice))

А если я хочу воткнуть повтор запроса y/n если введён символ, отличный от y или n? Как-то такая конструкция не кажется мне удобной.

Ramen ★★★★
() автор топика

... char name[12]; char surname[12]; ... scanf("%12s", &stud[amt].name); scanf("%12s", &stud[amt].surname); ... OH SHI~. Используйте -Wall, мать вашу!

anonymous
()

...
   char name[12];
   char surname[12];
...
      scanf("%12s", &stud[amt].name);
      scanf("%12s", &stud[amt].surname);
...
OH SHI~. Используйте -Wall, мать вашу!

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

OH SHI~. Используйте preformatted text и смотрите иногда превью.

anonymous
()

За подобные употребления scanf - УБИВАТЬ.

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