सवाल स्कैनफ ("% * s") और स्कैनफ ("% * डी") प्रारूप पहचानकर्ता क्या है?


प्रारूपों का व्यावहारिक उपयोग क्या है "%*" स्कैनफ में ()। यदि यह प्रारूप मौजूद है, तो इसके पीछे कुछ उद्देश्य होना चाहिए। निम्नलिखित कार्यक्रम अजीब आउटपुट देता है।

#include<stdio.h>
int main()
{
        int i;
        char str[1024];

        printf("Enter text: ");
        scanf("%*s", &str);
        printf("%s\n", str);

        printf("Enter interger: ");
        scanf("%*d", &i);
        printf("%d\n", i);
        return 0;
}

आउटपुट:

manav@workstation:~$ gcc -Wall -pedantic d.c
d.c: In function ‘main’:
d.c:8: warning: too many arguments for format
d.c:12: warning: too many arguments for format
manav@manav-workstation:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
manav@workstation:~$

44
2018-01-28 15:16


मूल


मानव, आपके कुछ हालिया प्रश्नों के आधार पर, आपको पाठ्य पुस्तक पढ़ने के लिए अच्छा लगेगा। - Alok Singhal
@ आलोक: ठीक है मैंने एक पाठ्य पुस्तक पढ़ी है लेकिन इस तरह के विवरण में नहीं गए थे। अधिकांश टेक्स्ट-बुक रीयल-टाइम उपयोग को पूरा करने वाले उदाहरण प्रदान नहीं करते हैं। मुझे लगता है, करने के लिए सबसे अच्छी बात यह है कि "सी कंपाइलर डिज़ाइन" टेक्स्ट-बुक पढ़ना होगा। - manav m-n
@ मणव: आपको निश्चित रूप से "सी कंपाइलर डिज़ाइन" पुस्तक की आवश्यकता नहीं है। क्या आपने के एंड आर की कोशिश की है? - Alok Singhal
@ आलोक: मैं के एंड आर पढ़ना शुरू कर दूंगा लेकिन फिर भी मुझे लगता है कि सी प्रोग्रामिंग कोर्स ऑपरेटिंग सिस्टम और "सी कंपाइलर डिज़ाइन" के पर्याप्त ज्ञान के बिना अपूर्ण है - manav m-n
@Manav: man 3 printf आपके प्रश्न का उत्तर भी देगा। - jamesdlin


जवाब:


Printf के लिए, * आपको अतिरिक्त पैरामीटर के माध्यम से न्यूनतम फ़ील्ड चौड़ाई निर्दिष्ट करने की अनुमति देता है, यानी। printf("%*d", 4, 100); 4 की फ़ील्ड चौड़ाई निर्दिष्ट करता है।

के लिये scanf, * इंगित करता है कि फ़ील्ड को पढ़ना है लेकिन अनदेखा किया गया है, ताकि i.e. scanf("%*d %d", &i) इनपुट के लिए "12 34" 12 को अनदेखा कर देगा और 34 को पूर्णांक में पढ़ा जाएगा I।


86
2018-01-28 15:21



कृपया इसे "printf ("% * d ", 4, 100) बदलें;" "printf ("%। * डी ", 4, 100);" ।* इस्तेमाल किया जाना चाहिए। - Sridharan


स्टार एक ध्वज चरित्र है, जो विनिर्देशन द्वारा पढ़े गए पाठ को अनदेखा करता है। Glibc दस्तावेज़ीकरण से qoute करने के लिए:

एक वैकल्पिक ध्वज चरित्र '*', जो इस विनिर्देश के लिए पढ़ने वाले पाठ को अनदेखा करता है। जब स्कैनफ को एक रूपांतरण विनिर्देश मिलता है जो इस ध्वज का उपयोग करता है, तो यह शेष रूपांतरण विनिर्देशन द्वारा निर्देशित इनपुट को पढ़ता है, लेकिन यह इस इनपुट को छोड़ देता है, पॉइंटर तर्क का उपयोग नहीं करता है, और सफल असाइनमेंट की गिनती में वृद्धि नहीं करता है।

यह परिस्थितियों में उपयोगी होता है जब विनिर्देश स्ट्रिंग में एक से अधिक तत्व होते हैं, उदाहरण के लिए .:   scanf("%d %*s %d", &i, &j) के लिए "12 test 34" - कहा पे मैं और j पूर्णांक हैं और आप बाकी को अनदेखा करना चाहते हैं।


18
2018-01-28 15:20





देख यहाँ

एक वैकल्पिक प्रारंभिक तारांकन इंगित करता है कि डेटा को stdin से पुनर्प्राप्त किया जाना है, लेकिन अनदेखा किया गया है, यानी यह संबंधित तर्क में संग्रहीत नहीं है।


6
2018-01-28 15:20





* किसी भी चर में डाले बिना इनपुट छोड़ने के लिए प्रयोग किया जाता है। इसलिए scanf("%*d %d", &i); दो पूर्णांक पढ़ेगा और दूसरा एक अंदर रखेगा i

आपके कोड में आउटपुट का मूल्य केवल वह मान है जो अनियमित में था i परिवर्तनीय - स्कैनफ कॉल ने इसे नहीं बदला।


5
2018-01-28 15:20





में scanf("%*d",&a)  * इनपुट छोड़ देता है। इनपुट को पढ़ने के लिए किसी को अतिरिक्त उपयोग करना होगा "%d" में scanf। उदाहरण के लिए:

 int a=1,b=2,c=3;
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30

ओ / p:

a=10 b=30 and c=3;  // 20 is skipped

यदि आप दूसरे का उपयोग करते हैं %d  अर्थात: scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 फिर एक = 10 बी = 30 सी = 40।

यदि तुम प्रयोग करते हो "," स्कैनफ में तब कोई मूल्य नहीं लिया जाएगा %*d अर्थात;      scanf("%d %*d,%d" &a,&b,&c)// 10 20 30     ओ / p:     एक = 10 बी = 2 सी = 3 आउटपुट होगा।


2
2017-09-23 15:49