2014-01-20 5 views
0
#include <stdio.h> 
main() 

{ 
    int num; 
    char another="y"; 
    for(;another=="y";) 
    { 
     printf("no. is "); 
     scanf("%d", &num); 
     printf("sq. of %d is %d", num,num*num); 
     printf("\nWant to enter another no. : y/n"); 
     scanf("%c", &another); 
    } 
} 

У меня есть код C вроде этого. По мне, это должно работать так: введите «нет» и дайте квадрат. Но он не работает в бесконечном цикле. Но он работает только один раз. Зачем?Почему цикл работает один раз?

Я использую компилятор GCC4.8.1 на окнах 64 бит.

+3

Я предлагаю вам включить предупреждения компилятора (или поднять уровень). 'char another =" y ";' недействителен. – Vicky

+3

'' y '' -> '' y'', '"% c "' -> '"% c "' – BLUEPIXY

+0

Кроме того, для этого вопроса запустите его в отладчике или добавьте printf () после scanf(), чтобы узнать, что такое содержимое «другого», когда вы проходите через цикл. Это действительно не сложно. – Vicky

ответ

2

Потому что на второй итерации scanf присвойте \n вместо .

ОБЪЯСНЕНИЕ: При нажатии Enter клавиши после ввода ввода, затем еще один символ идет в буфер вместе с набранным входом. Этот персонаж создается Введите и есть \n. Предположим, вы набрали y, а затем нажали . Введите ключ, тогда буфер будет содержать y\n, т.е. два символа, y и \n.
Когда выполняется scanf("%d", &num);, он считывает введенный номер и оставляет за символом \n в буфере для следующего звонка scanf. Этот \n читается следующим scanf вызовом scanf("%c", &another);, независимо от того, что вы набрали в консоли.

Чтобы съесть эту новую строку char, используйте пробел перед %c спецификатором в scanf.

scanf(" %c", &another); 
     ^Notice the space before %c. 

И изменить

for(;another=="y";) {...} // Remove the double quote. 

к

for(;another=='y';) {...} // Single quote is used for `char`s. 
+2

Пожалуйста, объясните. Я новичок – user3207558

+0

@ user3207558; Теперь лучше? Вам нужно больше информации? – haccks

0

Испытание в контуре является неправильным:

another=="y" 

это сравнивает значение another, один символ, со значением строковый литерал, который будет переименован в качестве указателя на символ y. Оно должно быть:

another == 'y' 

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

Смежные вопросы