2014-11-30 3 views
10

साथ उलझन this code पढ़ने से, मैं निम्नलिखित printf() बयान पर ठोकर खाई:दिलचस्प printf() बयान

// reset, hide cursor and clear screen 
printf("\e[0m\e[?25l\e[2J"); 

मैं मानता चाहिए कि मैं एक पूरी तरह से योग्य सी हैकर नहीं कर रहा हूँ और पूरी तरह से इस बात को समझ नहीं है। मैंने तर्कों को हटाकर, चारों ओर tweaked, और मैं समझता हूं कि यह क्या करता है (ठीक है, टिप्पणी वास्तव में यह सब कहते हैं), लेकिन मुझे नहीं पता कि यह कैसे किया जाता है। इसके अलावा, यह Google के लिए कुछ मुश्किल है।

यह printf() कॉल कैसे काम करता है?

+7

'मैन 5 टर्म कैप 'या' मैन 5 टर्मिनोफो ' – wildplasser

+2

' printf()' के परिप्रेक्ष्य से यह किसी अन्य 'printf() 'कथन की तरह काम करता है: यह मानक आउटपुट के लिए' char 'का अनुक्रम प्रिंट करता है। प्रोग्राम के आउटपुट को फ़ाइल में रीडायरेक्ट करने का प्रयास करें और उसके बाद इसकी सामग्री का निरीक्षण करें। – alk

+0

संभावित डुप्लिकेट [विंडोज़ और लिनक्स कंसोल में स्क्रीन के शीर्ष पर स्क्रीन पॉइंट रीसेट करें] (http://stackoverflow.com/questions/56324/reset-screen-point-to-the-top-of- स्क्रीन-in- विंडोज-लिनक्स-कंसोल) – 2501

उत्तर

11

यह वास्तव में printf के साथ कुछ भी करने के लिए नहीं है। सी 11 मानक §5.2.2 में भागने के अनुक्रमों को सूचीबद्ध करता है, और सूची में \a, \b, \f, \n, \r, \t और \v शामिल हैं। भाग होने के नाते GCC\e समझता है एक एस्केप अनुक्रम जो ASCII वर्ण के लिए खड़ा होने के लिए Esc (\E रूप में अच्छी तरह से काम कर सकते हैं, या अपने संकलक उनमें से कोई भी समर्थन कर सकते हैं। अपने संकलक के लिए दस्तावेज़ देखें)। निम्न पोर्टेबल control sequences क्या हैं। वे सभी टर्मिनल में काम करने की गारंटी नहीं देते हैं, या यहां तक ​​कि बिल्कुल भी काम करते हैं। जानने का सबसे अच्छा तरीका है अपने सिस्टम के लिए प्रलेखन से परामर्श करना।

§6.4.4.4 ऑक्टल एस्केप दृश्यों का भी वर्णन करता है। उदाहरण के लिए, \033, जहां 03327 दशमलव में है, और इसलिए ASCII में बचने वाला चरित्र है। इसी तरह, आप \x1b का उपयोग कर सकते हैं, जो एक ही वर्ण निर्दिष्ट एक हेक्साडेसिमल भागने अनुक्रम है।

हम od -c के साथ कार्यक्रम के उत्पादन का निरीक्षण किया, तो यह 033 को दर्शाता है।

(✿´‿`) ~/test> ./a.out | od -c 
0000000 033 [ 0 m 033 [ ? 2 5 l 033 [ 2 J 
0000016 

एएनएसआई भागने दृश्यों टर्मिनल emulators से व्याख्या कर रहे हैं। सी अंडाकार/हेक्साडेसिमल एस्केप दृश्यों को ASCII Esc वर्ण में परिवर्तित करेगा। एक एक्सटेंशन के रूप में आपका कंपाइलर \e या \E भी परिवर्तित कर सकता है। के रूप में अनुरोध किया है, क्या नियंत्रण दृश्यों की एक संक्षिप्त व्याख्या कर रहे हैं:

  • [0m: रीसेट करता है सब SGR विशेषताओं
  • [?25l: विकिपीडिया से:

    कर्सर

  • [2J छुपाता स्क्रीन का हिस्सा साफ़ करता है। यदि n 0 (या अनुपलब्ध) है, तो स्क्रीन के अंत में कर्सर से साफ़ करें। यदि n 1 है, तो कर्सर से स्क्रीन की शुरुआत से साफ़ करें। यदि n 2, स्पष्ट पूरे स्क्रीन ... है

+0

क्या आप प्रश्न में वास्तव में 'printf' कमांड के बारे में अधिक विस्तृत स्पष्टीकरण जोड़ सकते हैं? –

+1

@ डैनियल वहां, मैंने इसे संपादित किया। –

7

printf() कॉल बस बाइट मूल्यों की एक विशेष श्रृंखला outputting है। "जादू" यह है कि वे मान टर्मिनल में विशेष हैं।

एएससीआईआई "एस्केप" चरित्र से शुरू होने वाली बाइट्स की एक विशेष श्रृंखला को "एस्केप अनुक्रम" कहा जाता है। इन्हें धारावाहिक डेटा टर्मिनलों के लिए आविष्कार किया गया था, जहां टर्मिनल के साथ संचार का एकमात्र साधन सीरियल कनेक्शन के माध्यम से बाइट मूल्य भेज रहा था। सामान्य अक्षर टर्मिनल पर बस प्रदर्शित होते हैं, लेकिन कर्सर को स्थानांतरित करने, स्क्रीन साफ़ करने, आदि के लिए एक रास्ता तय करना वांछनीय था और अधिकांश टर्मिनलों ने इसके लिए भागने के दृश्यों का उपयोग किया था।

http://en.wikipedia.org/wiki/Escape_sequence

एक विशेष रूप से लोकप्रिय टर्मिनल "VT100" कहा जाता था, और आज सबसे टर्मिनल emulators VT100 भागने दृश्यों का उपयोग कर कार्य करते हैं।

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