2012-08-06 15 views
6

अब इस छोटे से कार्यक्रम देखने की सुविधा देतासी ++: क्या स्ट्रैट() ओवरराइट या शून्य को स्थानांतरित करता है?

char s[20]="One"; 
strcat(s,"Two"); 
cout<<s<<endl; 
पहले रों पर

यहाँ मूल्य 'द वन' है और दृश्य प्रतिनिधित्व के लिए इस रों का मान:

ओ - n - ई - \ 0

तो मैं स्ट्रिंग के अंत करने के लिए "दो" जोड़ने के इस उत्पादन:

ओ - n - ई - टी - डब्ल्यू - ओ - \ 0

अब के रूप में आप देख सकते हैं पहले स्ट्रिंग में केवल एक नल "वन" के बाद थी, अब यह "वनटू"

मेरा प्रश्न है: स्ट्रिंग "दो" स्ट्रिंग द्वारा शून्य को ओवरराइट किया गया है और फिर यह अंत में अपने स्वयं के शून्य को जोड़ता है।

या फिर शुरुआत में पहले से ही अंत में वापस आने वाला शून्य है?

(यह सवाल एक फर्क करने के लिए नहीं लग सकता है, लेकिन मैं बारे में सब कुछ मैं सीखना जानना चाहते)

धन्यवाद

+4

यदि आप सी ++ का उपयोग कर रहे हैं, तो 'strcat' की कोई आवश्यकता नहीं है। 'Std :: string' और' + = 'का उपयोग करें। – Drise

उत्तर

12

पहले \0 ओवरराइट किया गया है, और एक नया \0 समेकित स्ट्रिंग के अंत में जोड़ा गया है। यहां कुछ भी "चलने" के लिए कोई गुंजाइश नहीं है। ये वे स्थान हैं जिन पर मूल्य असाइन किए जाते हैं।

2

हाँ, strcat को पहले तर्क की \0 ओवरराइट हो जाता है, और यह हो जाता है concatenated स्ट्रिंग का अंतिम चरित्र।

यह इस तरह के रूप नहीं कदम करता है, समारोह सिर्फ \0श्रेणीबद्ध स्ट्रिंग के अंतिम वर्ण के रूप में जोड़ देता है।

2

सुनिश्चित करने का एकमात्र तरीका strcat के अपने विशेष संस्करण के स्रोत को देखना है। सामान्य कार्यान्वयन पहली नल को ओवरराइट करेगा और दूसरी स्ट्रिंग से शून्य को अंतिम स्थिति में कॉपी करेगा।

हालांकि यह वास्तव में नाइट-पिकिंग है, आप आउटपुट में अंतर का पता लगाने में सक्षम नहीं होंगे, इससे कोई फर्क नहीं पड़ता कि किस विधि का उपयोग किया जाता है।

4

हालांकि प्रश्न का सही उत्तर दिया गया है और बार-बार, स्रोत ™ से सबसे आधिकारिक उत्तर प्राप्त करना अच्छा हो सकता है। या कम से कम स्रोतों से मैं Google के साथ मिल सकता हूं।

This document, जो सी ++ स्टैंडर्ड (या एक काम मसौदा क्या है) होने का दावा, का कहना है:

सी ++ मानक पुस्तकालय सी पुस्तकालय [strcat सहित] से 209 मानक कार्यों प्रदान करता है। - "मानक सी पुस्तकालय", सी 2।7, स्नातकोत्तर 811

this document के लिए खत्म हो कूदते सी अंतर्राष्ट्रीय मानक होने का दावा, हम देखते हैं:

strcat समारोह संलग्न कर देता है स्ट्रिंग की एक प्रति s2 द्वारा की ओर इशारा किया (समाप्त अशक्त सहित चरित्र) स्ट्रिंग के अंत तक s1 द्वारा इंगित किया गया। s2का शुरुआती चरित्र s1 के अंत में शून्य वर्ण को ओवरराइट करता है। यदि प्रतिलिपि ऑब्जेक्ट्स के बीच प्रतिलिपि होती है जो ओवरलैप होती है, तो व्यवहार अपरिभाषित होता है।

- "strcat समारोह", 7.21.3.1, स्नातकोत्तर 327

strcat वास्तव में अशक्त चरित्र के ऊपर लिख देता है।

संबंधित मुद्दे