C characters, strings और buffer capacity
उद्देश्य और contracts
Array/pointer आधार से आगे character storage समझें: character array और terminated string अलग करें, capacity निकालें और केवल valid accesses trace करें। ISO C11/C17 उपयोग करते हैं। sizeof का unit byte है; sizeof(char)=1, पर CHAR_BIT आठ होना आवश्यक नहीं। Plain char signed या unsigned हो सकता है। स्पष्ट रूप से न कहें तो ASCII values नहीं मानते। उदाहरण basic execution characters के हैं।
1. Character, array और string अलग हैं
C में 'A' का type int है; "A" string literal दो char objects देता है: character और terminator '\0'। '\0' null character है, digit '0' नहीं। Empty string "" एक char storage लेती है और उसकी length zero है। Null pointer empty string नहीं; strlen को null pointer देना invalid है।
char a[]="CAT" से writable चार-element array C,A,T,\0 बनता है। sizeof a=4 और strlen(a)=3। char b[3]="CAT" C में permitted है: explicitly sized array में terminator की जगह न होने पर वह छूट जाता है। तीन characters fit हैं, लेकिन b C string नहीं। strlen(b) array के बाहर terminator खोजेगा, इसलिए undefined behavior। बाद में कोई zero कल्पित न करें।
char *p="CAT" literal की ओर pointer बनाता है। Declaration C में legal है, पर literal बदलना undefined behavior है। Read-only intent के लिए const char *p="CAT" बेहतर है। दूसरी ओर char a[]="CAT" का अपना writable storage है; a[0]='B' valid है। sizeof p pointer object का size है, string का नहीं; pointer size fixed नहीं मानते।
2. Capacity में आखिरी zero भी शामिल है
Length L की string को कम-से-कम L+1 char elements चाहिए। Capacity allocated storage है; length पहले zero से पहले का count है। char s[8]="cat" की capacity 8, length 3 है; शेष initialized elements zero हैं। s[1]='\0' से length 1 हो जाती है, capacity नहीं बदलती। बाद के पुराने characters storage में हैं, visible string prefix में नहीं।
Safe append: char s[6]="cat" के bytes c,a,t,0,0,0 हैं। n=strlen(s)=3। 's' जोड़ते समय n+1<sizeof s जाँचें; s[n]='s', फिर s[n+1]='\0'। अंत में c,a,t,s,0,0: length 4, capacity 6। Terminator overwrite करके नया in-bounds zero सुनिश्चित न करना सामान्य safe append नहीं। Arbitrary capacity में cap>0 तथा n valid string length होने पर n<cap−1 check extreme size_t पर n+1 overflow से बचाता है।
ज्ञात k characters को nonoverlapping destination में copy करते समय k<cap चाहिए। 0..k−1 copy करें और dst[k]=0 रखें। Source में k readable characters आवश्यक हैं। strcpy के लिए source termination, destination capacity और no overlap चाहिए। strncpy(dst,src,n) अपने-आप safe string नहीं बनाता: source length≥n हो तो terminator नहीं लिखता; छोटी source हो तो कुल n writes तक zeros pad करता है। अतः short input पर भी destination capacity≥n चाहिए। Function-name देखकर सुरक्षा न मानें; स्पष्ट length/capacity contract रखें।
3. Array-to-pointer conversion में bound खो जाता है
sizeof तथा unary & जैसे विशेष contexts छोड़कर array expression first element के pointer में बदलता है। char a[4] में a सामान्यतः char* बनता है, जबकि &a का type char (*)[4] है, अर्थात पूरी array का pointer। a+1 एक char आगे; &a+1 पूरी array के बाद। Legal one-past pointer बना सकते हैं, dereference नहीं।
void inspect(char s[20]) में parameter char *s में adjust होता है; caller ने बीस elements दिए हों, इसकी guarantee नहीं। Function के अंदर sizeof s pointer size है। Capacity अलग argument में दें या उचित explicit array contract लें। Pointer मात्र से literal, local array, allocation या दूसरी array के suffix का अंतर नहीं पता चलता।
Suffix trace: char a[]="gate"; char *p=a+1; में p की string "ate" है, strlen(p)=3, sizeof a=5 और p[2]='e'। Valid array indices 0..4 हैं। a+5 one-past legal है, *(a+5) नहीं। यहाँ p[-1] valid है क्योंकि वह a[0] है। Negative index अपने-आप गलत नहीं: उसी array की सीमा देखें। p[-2] array से पहले जाता है और invalid है।
4. Characters, comparisons और safe tracing
सभी execution character sets में letters consecutive न मानें। Decimal digits '0'..'9' consecutive हैं; c>='0' && c<='9' जाँचने के बाद c-'0' digit देता है। String equality content की है, pointer == की नहीं: "cat" वाली अलग arrays के लिए strcmp zero देता है, उनके pointers अलग objects बताते हैं। strcmp केवल negative/zero/positive की guarantee देता है, ठीक −1 या 1 की नहीं। आगे के character-I/O और classification सुझावों में INT_MAX>=UCHAR_MAX मानें, जैसा सामान्य implementations में होता है। isalpha जैसे functions को EOF या unsigned char में representable value चाहिए; संभव negative plain char को पहले unsigned char में cast करें। getchar का result int में रखें ताकि सभी unsigned-char values और EOF अलग रह सकें।
गलतियों की checklist
strlen/strcmp/copy से पहले storage के भीतर reachable terminator और readability सिद्ध करें। Write से पहले writable lifetime तथा zero सहित capacity देखें। हर edit के बाद first zero track करें। sizeof(pointer) से array length न निकालें, uninitialized bytes को terminator न मानें, literal में write न करें और one-past dereference न करें।
मौलिक अभ्यास: छह single-correct MCQs
ये मौलिक शिक्षण प्रश्न हैं, previous-year questions नहीं। एक विकल्प चुनें।
P01. char a[]="CAT" में sizeof a और strlen(a)?
A. 3 और 3 B. 4 और 3 C. 4 और 4 D. Pointer size और 3
उत्तर: B
A: sizeof में terminator आता है।
B: चार elements, zero से पहले तीन characters हैं।
C: strlen terminator नहीं गिनता।
D: यहाँ a वास्तविक array है।
P02. C11/C17 में char b[3]="CAT" के बारे में सही कथन?
A. Terminator न fit होने से declaration illegal है B. चार elements बनते हैं C. Array initialization valid है, लेकिन b terminated string नहीं D. strlen(b) निश्चित 3 देगा
उत्तर: C
A: C इस initialization में zero omission की अनुमति देता है।
B: Declared array में तीन ही elements हैं।
C: केवल C,A,T store हैं, terminator नहीं।
D: strlen zero खोजते समय object से बाहर पढ़ेगा।
P03. char s[8]="cat"; s[1]=0; के बाद strlen(s):
A. 1 B. 2 C. 3 D. 8
उत्तर: A
A: पहला zero index 1 पर है।
B: Length terminator नहीं गिनती।
C: Earlier zero से पुरानी length बदल गई।
D: आठ capacity है।
P04. void f(char s[20]) के अंदर sizeof s किसका size है?
A. बीस characters B. वर्तमान string length C. Length+1 D. Adjusted pointer parameter
उत्तर: D
A: Array parameter pointer में adjust होता है।
B: sizeof zero खोजता नहीं।
C: Referenced string का storage नहीं मापता।
D: s का adjusted type char* है।
P05. char a[]="gate"; char *p=a+1; में कौन valid है?
A. p[-2] B. *(a+5) C. p[-1] D. char *q="gate" से literal में write
उत्तर: C
A: यह array से पहले है।
B: a+5 one-past है; dereference नहीं।
C: p[-1], valid a[0] है।
D: Literal modification undefined है।
P06. Writable nonoverlapping dst[4] में strncpy(dst,"abcd",4) क्या करता है?
A. Zero सहित पाँच bytes B. चार characters, कोई terminator नहीं C. हमेशा dst overflow D. तीन characters और zero
उत्तर: B
A: यहाँ count चार writes तक है।
B: Source में चार characters हैं; zero copy नहीं होता।
C: चार writes fit हैं, लेकिन result string नहीं।
D: strncpy last slot zero के लिए reserve नहीं करता।
स्रोत और दायरा
GATE CS 2026 के मौजूदा आधार-पाठों का सीमित विस्तार। पूरे विषय की पूर्णता का दावा नहीं। उदाहरण और प्रश्न मौलिक हैं।
प्रगति सहेजने के लिए साइन इन करें। साइन इन