Theory
"Masala Dosa" कहाँ रहता है?
Till को item names store करने हैं: "Chai", "Masala Dosa", "Chhaas"।
यहाँ surprise है: core C++ ने C से कोई built-in string type inherit नहीं किया। 12 के लिए int है, 12.50 के लिए double, और text के लिए... उस तरह का कुछ नहीं।
तो 1972 से हर C program ने text कैसे handle किया? एक trick से: एक line में खड़ी chars की एक army, plus एक invisible guard जो mark करता है line कहाँ ख़त्म होती है।
Theory
एक guard coach वाली train
एक string को एक train समझिए: हर coach एक character ढोता है, C, h, a, i। आख़िर में एक guard coach चलता है जिसे passengers कभी नहीं देखते: null character \0।
हर string function एक ही तरीक़े से काम करता है: engine से शुरू कीजिए और coach by coach guard तक चलिए। यही उन्हें पता चलता है string कहाँ रुकती है। Guard खो दीजिए और function random memory में चला जाता है।
Theory
Character array, formally
एक C-style string एक char array है जिसका content null terminator `\0` पर ख़त्म होता है:
char item[6] = "Chai";
Memory: C h a i \0 (5 slots इस्तेमाल हुए, 1 spare)। Literal "Chai" में 4 visible characters हैं पर इसे 5 bytes चाहिए।
दो rules: array text plus \0 के लिए काफ़ी बड़ा होना चाहिए, और declaration के बाद आप = से assign नहीं कर सकते (item = "Dosa" illegal है, arrays assignable नहीं हैं: copying एक function का काम है)।
Theory
एक pointer train पर चलता है
एक char का pointer पहले coach का address hold करता है:
char *p = item;
अब *p 'C' है, और p++ अगले character पर जाता है। यह loop एक string उसी तरह print करता है जैसे library ख़ुद करती:
while (*p != '\0') { cout << *p; p++; }
नीचे का हर string.h function चुपचाप यही loop है अलग uniform पहने हुए। एक बार walk समझिए और पाँचों functions obvious हो जाते हैं।
Practical
<cstring> के पाँच workers
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[20] = "Masala";
char b[] = "Dosa";
cout << strlen(b) << endl; // 4, the guard \0 is not counted
strcat(a, b); // a becomes "MasalaDosa"
cout << a << endl;
char copy[20];
strcpy(copy, a); // copy now holds "MasalaDosa"
cout << strcmp("Chai", "Chai") << endl; // 0 means EQUAL
cout << strcmp("Chai", "Dosa") << endl; // negative: C before D
return 0;
}
At a glance
string.h एक नज़र में
| Function | काम | याद रखिए |
|---|---|---|
| strlen(s) | Characters गिनता है | \0 exclude करता है |
| strcpy(d, s) | s को d में copy करता है | d काफ़ी बड़ा होना चाहिए |
| strcat(d, s) | s को d पर append करता है | d को दोनों के लिए जगह चाहिए |
| strcmp(a, b) | Alphabetically compare करता है | 0 = equal, sign = order |
| strrev(s) | In place reverse करता है | Non-standard (Turbo C) |
Think first
ख़ुद गिनिए
char t[10] = "Chai";
tap करने से पहले, दोनों का जवाब दीजिए: strlen(t) क्या return करता है, और array के कितने bytes "Chai" असल में लेता है?
Show the answer
strlen(t) 4 return करता है: यह visible characters गिनता है और guard पर रुक जाता है। पर text 5 bytes लेता है: C, h, a, i, \0। यह gap सबसे-ज़्यादा-tested string fact है। Size n का array declare कीजिए और यह ज़्यादा से ज़्यादा length n minus 1 की एक string hold कर सकता है।
Quiz
Till membership check करता है: if (strcmp(entered, "STAFF123"))। Password exactly match करता है। strcmp क्या return करता है, और क्या if run होता है?
- 0 return करता है, तो if run NAHI होता
- 1 (true) return करता है, तो if run होता है
- 0 return करता है, और 0 true है तो if run होता है
- यह string length, 8, return करता है
Show the answer
0 return करता है, तो if run NAHI होता
Equal strings strcmp को 0 return करवाती हैं, और C++ में zero false है, तो if block skip हो जाता है। यह उल्टी logic हज़ारों students को पकड़ती है: सही equality test strcmp(a, b) == 0 है। Option B बिल्कुल वही misconception है जो test हो रहा है; strcmp कभी lengths return नहीं करता, और 0 कभी true नहीं है।
Watch out
यहाँ marks leak होते हैं
strcmp 0 confusion: अपने answer में लिखिए 0 का मतलब equal है, negative का मतलब पहली string alphabetically पहले आती है, positive का मतलब बाद में।
strcpy overflow: एक char[10] में 15 characters copy करना बिना किसी error के compile होता है और runtime पर memory corrupt कर देता है।
strrev standard नहीं है: यह Turbo C में exist करता है पर GCC में नहीं। एक GCC environment में आप अपने loop से reverse करते हैं; पूछे जाने पर यह कहिए।
Theory
आगे का bridge
C++ बाद में std::string class offer करता है, जो अपनी memory ख़ुद रखता है, = और + allow करता है, और ज़्यादातर traps हटा देता है। आपका exam अभी भी char arrays और string.h पहले test करता है, क्योंकि वे सिखाते हैं text memory में असल में क्या है। जब आप classes तक पहुँचेंगे, नोटिस कीजिए std::string बस किसी के इसी train-and-guard idea के आस-पास लिखी एक class है।
Summary
Key takeaways
- एक C-string null terminator \0 पर ख़त्म होने वाला एक char array है: "Chai" को 4 letters के लिए 5 bytes चाहिए।
- एक char pointer array पर coach by coach चलता है जब तक \0 न मिले।
- strlen \0 के बिना गिनता है; strcpy copy करता है; strcat append करता है; दोनों को काफ़ी बड़ा destination चाहिए।
- strcmp EQUAL के लिए 0 return करता है (== 0 से test कीजिए), alphabetical order के लिए negative या positive।
- strrev in place reverse करता है पर non-standard है (सिर्फ़ Turbo C, GCC में नहीं)।
- Arrays = से assign नहीं हो सकते; text copy करना strcpy का काम है।
- Memory hook: guard coach वाली train।