2012-12-11 17 views
6

का उपयोग करके काम नहीं करता है मैं सी प्रोग्रामिंग को झुका रहा हूं। मैंने एक अजीब पाश लिखा है लेकिन scanf() में उपयोग करते समय काम नहीं करता है।
यहाँ कोड है:विषम पाश% c

#include<stdio.h> 
void main() 
{ 
    char another='y'; 
    int num; 
    while (another =='y') 
    { 
     printf("Enter a number:\t"); 
     scanf("%d", &num); 
     printf("Sqare of %d is : %d", num, num * num); 
     printf("\nWant to enter another number? y/n"); 
     scanf("%c", &another); 
    } 
} 

लेकिन अगर मैं इस कोड में %s उपयोग करते हैं, उदाहरण के लिए scanf("%s", &another);, तो यह ठीक काम करता है।
ऐसा क्यों होता है? कोई उपाय?

+0

जब आप 'num' दर्ज करते हैं और ENTER दबाते हैं, तो ENTER का AScii कोड स्कैनफ़ बफर में संग्रहीत होता है, और जब भी आप अगले एकल वर्ण को पढ़ते हैं, तो यह उपयोगकर्ता इनपुट की प्रतीक्षा नहीं करेगा और' ENTER' ascii कोड संग्रहीत किया जाएगा 'अन्य 'चर में। –

उत्तर

1

इस मामले में scanf() के बजाय getch() का उपयोग करें। क्योंकि scanf() अपेक्षा करता है '\ n' लेकिन आप उस scanf() पर केवल एक char स्वीकार कर रहे हैं। तो '\ n' अगले स्कैनफ() को भ्रम पैदा करने के लिए दिया गया।

10

%c रूपांतरण इनपुट से अगले एकल वर्ण को पढ़ता है, चाहे वह क्या हो। इस मामले में, आपने पहले %d का उपयोग कर एक नंबर पढ़ा है। आपको उस संख्या के लिए एंटर कुंजी को पढ़ना होगा, लेकिन आपने इनपुट स्ट्रीम से नई लाइन को पढ़ने के लिए कुछ भी नहीं किया है। इसलिए, जब आप %c रूपांतरण करते हैं, तो यह इनपुट स्ट्रीम से नई लाइन को पढ़ता है (वास्तव में कुछ भी वास्तव में प्रवेश करने के लिए इंतजार किए बिना, क्योंकि पहले से इनपुट इनपुट पढ़ने की प्रतीक्षा कर रहा है)।

जब आप %s का उपयोग करते हैं, तो यह सफेद-स्पेस के अलावा कुछ चरित्र प्राप्त करने के लिए किसी भी प्रमुख सफेद-स्थान पर छोड़ देता है। यह एक नई लाइन को सफेद-स्थान के रूप में मानता है, इसलिए यह पूरी तरह से प्रतीक्षा करने वाली नई लाइन में छोड़ देता है। चूंकि वहां (अनुमानतः) कुछ भी पढ़ने की प्रतीक्षा नहीं कर रहा है, इसलिए आप कुछ ऐसा दर्ज करने के लिए इंतजार कर रहे हैं, जैसा कि आप स्पष्ट रूप से चाहते हैं।

यदि आप रूपांतरण के लिए %c का उपयोग करना चाहते हैं, तो आप इसे प्रारूप स्ट्रिंग में किसी स्थान से पहले कर सकते हैं, जो स्ट्रीम में किसी भी व्हाइट-स्पेस को छोड़ देगा।

+0

जानकारी के –

+0

@JessicaLingmn के लिए धन्यवाद: निश्चित रूप से। [अपरिभाषित व्यवहार] की सिफारिश के लिए –

0
#include<stdio.h> 
void main() 
{ 
char another='y'; 
int num; 
while (another =='y') 
{ 
    printf("Enter a number:\t"); 
    scanf("%d", &num); 
    printf("Sqare of %d is : %d", num, num * num); 
    printf("\nWant to enter another number? y/n"); 
    getchar(); 
    scanf("%c", &another); 
} 
} 
2

पहले स्कैनफ़% d के लिए कोई संख्या दर्ज करने के बाद, ENTER कुंजी stdin स्ट्रीम में झूठ बोल रही है। यह कुंजी scanf% c लाइन द्वारा कैप्चर की जाती है।

scanf("%1s",char_array); another=char_array[0]; का उपयोग करें।

+1

-1 (http://c-faq.com/stdio/stdinflush.html)। – Lundin

+0

मेरा बुरा ... जवाब संपादित करना। – anishsane