LINUX.ORG.RU

некорректная работа цикла


0

0

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

scanf ( «%c», &ch) ; while (ch != 'q' ) { ----------------------- // пропущенные операторы ----------------------- printf ( «Введите вес в фунтах : ») ; scanf ( «%f », &weight ) ; printf ( «Введите следующий товар : ») ; scanf ( «%c », &ch) ;

}

printf ( «Стоимость фунта товара : % .2f \n», rate ) ; ------------------------------------------- ------------------------------------------ Компиляция проходит нормально. После ввода числа в оператор цикла scanf ( «%f », &weight) получаю:

Введите следующий товар : Введите вес в фунтах :

То есть, внутри цикла, по достижении последнего оператора printf (), программа пропускает последний в цикле оператор scanf ( «%c », &ch) и сразу выводит предыдущий оператор printf () !? ; При изменении спецификатора в последнем операторе цикла scanf () на числовой ,например, все работает как должно ! Получается ,именно символьный спецификатор вносит путаницу ....Также нарушения по выходе из цикла. В чем может быть дело ? Все подобные программы работали нормально......


Это что, код на Лиспе?

anonymous
()

перенос строки скорее всего вычитывается. сбрасывай буффер перед чтением

exception13 ★★★★★
()

вот меня всегда удивляло:

#include <stdio.h>

int main(int argc, char** argv)
{
	char a,b;
	printf("input one:\n");
	scanf("%c",&a);
	printf("input two:\n");
	scanf("%c",&b);
	return 0;
}

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

если так, то

#include <stdio.h>

int main(int argc, char** argv)
{
	int a,b;
	printf("input one:\n");
	scanf("%d",&a);
	printf("input two:\n");
	scanf("%d",&b);
	return 0;
}
все нормально.

а если

#include <stdio.h>

int main(int argc, char** argv)
{
	char a,b;
	printf("input one:\n");
	scanf("%d",&a);
	printf("input two:\n");
	scanf("%d",&b);
	return 0;
}

то сегфолт, после ввода второго числа.

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

>я просто пост не распарсил.
Могу помочь распарсить, но думать уже лениво.


Программа на С. Непонятное нарушение работы цикла.

Самая суть, с пропуском не влияющих на данный результат операторов:

scanf ( "%c", &ch) ; while (ch != 'q' ) {
/* ----------------------- пропущенные операторы ----------------------- */
  printf ( "Введите вес в фунтах : ") ;
  scanf ( "%f ", &weight ) ;
  printf ( "Введите следующий товар : ") ;
  scanf ( "%c ", &ch) ;
}

printf ( "Стоимость фунта товара : % .2f \n", rate ) ;

Компиляция проходит нормально. После ввода числа в оператор цикла scanf ( «%f », &weight) получаю:
Введите следующий товар : Введите вес в фунтах :
PARSER COMMENT: Не знаю, выводится ли у автора перевод строки. Судя по коду, не должно бы, но код-то неправильно работает.

То есть, внутри цикла, по достижении последнего оператора printf (), программа пропускает последний в цикле оператор scanf ( «%c », &ch) и сразу выводит предыдущий оператор printf () !? ; При изменении спецификатора в последнем операторе цикла scanf () на числовой ,например, все работает как должно ! Получается ,именно символьный спецификатор вносит путаницу. Также нарушения по выходе из цикла. В чем может быть дело ? Все подобные программы работали нормально.


P.S.А если после последнего scanf ( «%c », &ch) ; вставить еще вывод 16-ричного кода ch и посмотреть, чего там такое прочитывается?

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

ну ясно.. значит та же проблема, что и я описал выше.

mono ★★★★★
()
сh = getchar();

вместо

scanf( "%c ", &ch) ;

или его как gets() нельзя использовать по каким-то соображениям?

Dikar ★★
()

не читал, но возможно fflush поможет

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

> то сегфолт, после ввода второго числа.

попытка записи 2-х байт в память, где выделен только 1 байт

use valgrind

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

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

#include <stdio.h> 

int main(int argc, char** argv)
{
   char a,b;
   printf("input one:\n");
   scanf("%c",&a);
   flushall();
   printf("input two:\n");
   scanf("%c",&b);
   return 0;
}

HINT: буфер ввода

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

ну с этим более менее ясно. вопрос в другом, почему на %d срабатывает, а на %c пролетает?

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

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

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

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

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

Действительно в этих ваших линуксах нету flushall().. попробуй вместо него fflush(NULL)

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

flush(NULL); не сработал.

Но объяснение разумное, спасибо.

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

Проблемы со сбросом буфера ,по теории, должны возникать у ранних версий компиляторов. Но у меня - gcc 4.3.2. При том что проблемы возникают только с символьным спецификатором scanf().
По идее, уже само наличие оператора scanf() должно вызывать сброс буфера, как функции ввода, независимо от спецификатора, без всяких дополнительных операторов. На деле получается - до сброса данных программа " щупает " спецификатор... Так все- таки , корень проблемы в компиляторе ? Но этот момент должен был быть давно изжит, по идее....

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