"बैकस्पेस" एस्केप चरित्र '\ b': अप्रत्याशित व्यवहार?


101

तो मैं अंत में के माध्यम से पढ़ रहा हूँ कश्मीर एंड आर , और मैं पहले कुछ पृष्ठों के भीतर कुछ सीखा है, वहाँ एक बैकस्पेस एस्केप वर्ण है कि, \b

इसलिए मैं इसका परीक्षण करने जाता हूं, और कुछ बहुत ही अजीब व्यवहार होता है:

#include <stdio.h>

main ()
{
    printf("hello worl\b\bd\n");
}

आउटपुट है

hello wodl

क्या कोई इसे समझा सकता है?

जवाबों:


145

आपका परिणाम किस तरह के टर्मिनल या कंसोल प्रोग्राम पर निर्भर करता है, इसके आधार पर अलग-अलग होगा, लेकिन हां, अधिकांश \bपर एक नॉनस्टैंडक्टिव बैकस्पेस है। यह कर्सर को पीछे की ओर ले जाता है, लेकिन जो है उसे मिटा नहीं पाता है।

तो hello worlभाग के लिए, कोड आउटपुट

हैलो वर्ल
          ^

... (जहां से ^पता चलता है कि कर्सर कहां है) तो यह दो \bवर्णों को आउटपुट करता है जो कर्सर को बिना मिटाए दो स्थानों पर ले जाता है (आपके टर्मिनल पर):

हैलो वर्ल
        ^

ध्यान दें कि कर्सर अब पर है r। फिर यह आउटपुट देता है d, जो rहमें अधिलेखित करता है और हमें देता है:

हैलो वोडल
         ^

अंत में, यह आउटपुट करता है \n, जो एक गैर-विनाशकारी नई रेखा lहै (फिर से, अधिकांश टर्मिनलों पर, जाहिरा तौर पर तुम्हारा सहित), इसलिए अपरिवर्तित छोड़ दिया जाता है और कर्सर को अगली पंक्ति की शुरुआत में ले जाया जाता है।


1
यदि यह नहीं मिटता है तो "आर" क्यों चला गया है?
cesoid

1
@cesoid: "आपका परिणाम क्या टर्मिनल या सांत्वना कार्यक्रम की तरह आप पर हैं पर निर्भर करती है"
टीजे Crowder

यह सिर्फ इतना है कि आपका उदाहरण आउटपुट में फिट नहीं होता है, इसलिए यह संभावित स्पष्टीकरण का उदाहरण नहीं है।
18'16

5
@cesoid के rसाथ प्रतिस्थापित किया गया है d। स्पष्टीकरण अभी भी फिट बैठता है।
syockit

1
@ इस्सोइड: टर्मिनल के बारे में दिलचस्प। विंडोज में, cmd.exeऔर command.comटर्मिनल हमेशा सम्मिलित नहीं होते हैं (आप व्यवहार को चालू करने के लिए इन्स कुंजी का उपयोग कर सकते हैं)। मुझे यह जानकर आश्चर्य हुआ कि मेरे मुख्य * निक्स कंप्यूटर पर गनोम टर्मिनल हमेशा सम्मिलित होता है, इसमें इंस कुंजी के आधार पर बहुत कम टॉगल के लिए वरीयता भी नहीं लगती है। इससे पहले कभी गौर नहीं किया। स्पष्ट रूप से मैं लगभग कभी भी टाइपओवर नहीं चाहता। :-)
टीजे क्राउडर

122
..........
^ <= सूचक "प्रिंट हेड"
            /* part1 */
            printf("hello worl");
हैलो वर्ल
          ^ <= सूचक "प्रिंट हेड"
            /* part2 */
            printf("\b");
हैलो वर्ल
         ^ <= सूचक "प्रिंट हेड"
            /* part3 */
            printf("\b");
हैलो वर्ल
        ^ <= सूचक "प्रिंट हेड"
            /* part4 */
            printf("d\n");
हैलो वोडल

^ <= अगली पंक्ति पर "प्रिंट हेड" के लिए सूचक

यदि भाग 4 के बाद कर्सर 'l' अक्षर पर है, तो क्या इसे 'n' से नहीं बदला जाना चाहिए? (परिणामस्वरूप "हेलो
वर्स्ट

@lucas_turci: बात यह है कि '\n'स्क्रीन पर प्रतिनिधित्व नहीं है। जो पहले से है वही रहता है; एक स्थान या किसी अन्य वर्ण प्रतिनिधित्व द्वारा प्रतिस्थापित नहीं किया गया।
पीएमजी

44

यदि आप एक विनाशकारी बैकस्पेस चाहते हैं, तो आपको कुछ इस तरह की आवश्यकता होगी

"\b \b"

यानी एक बैकस्पेस, एक स्पेस और दूसरा बैकस्पेस।


यह अभी भी अंतरिक्ष चरित्र नहीं छोड़ता है?
पचेरियर

खैर, हाँ, लेकिन बाद \bमें इसका मतलब होगा कि अगला आउटपुट चरित्र इसे अधिलेखित कर देगा।
पीटर के।

1
यदि बाद में कोई चरित्र न हो तो क्या होगा ?
पचेरियर

तब यह कोई फर्क नहीं पड़ता, क्या यह?
पीटर के।

1
हम्म। जब तक आपका उपकरण "डिलीट लास्ट कैरेक्टर" विकल्प (जैसे DEL / 0x7f) को लागू नहीं करता, मैं स्टम्प्ड हूं।
पीटर के।

8

समझाने के लिए बहुत मुश्किल नहीं है ... यह टाइपिंग की तरह है hello worl, बाएं-तीर कुंजी को दो बार dमारना , टाइप करना और नीचे-तीर कुंजी को मारना।

कम से कम, यह है कि मैं कैसे अपने टर्मिनल अनुमान लगा रहा है कोड \bऔर \nकोड।

आउटपुट को किसी फ़ाइल में रीडायरेक्ट करें और मुझे यकीन है कि आपको पूरी तरह से कुछ और मिलेगा। हालाँकि आपको अंतर देखने के लिए फ़ाइल के बाइट्स को देखना पड़ सकता है।

[संपादित करें]

थोड़ा विस्तार करने के लिए, यह printfबाइट्स के एक क्रम का उत्सर्जन करता है: hello worl^H^Hd^Jजहाँ ^HASCII वर्ण # 8 है और ^JASCII वर्ण / 10 है। आप अपनी स्क्रीन पर जो देखते हैं, वह इस बात पर निर्भर करता है कि आपका टर्मिनल उन नियंत्रण कोड की व्याख्या कैसे करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.