5.1.20 · D2 · Coding › C Programming › String handling — char arrays, null terminator, strcpy, strc
Intuition Yeh page kya karta hai
Parent note ne tumhe bataya tha ki ek C string ek hidden zero byte par khatam hoti hai aur
strcat "end dhundta hai, phir copy karta hai". Yahan hum har ek byte draw karte hain aur dekhte hain ki machine
yeh kaam kaise karti hai. Last picture tak tum strcat ko apne dimaag mein, box by box, chala sakoge aur dekh
sakoge exactly kahan ek buffer overflow paida hota hai.
Code chhuney se pehle, ek promise un words ke baare mein jo hum use karenge:
Definition Teen words jinse sab kuch bana hai
Ek byte ek chota sa box hai jo 0 se 255 tak ek number rakhta hai. Yeh sabse chhoti cheez hai jiske saath C
yahan kaam karta hai.
Ek char ("character") ek byte hai jise hum ek code table (ASCII) use karke ek letter ki tarah interpret karte hain. Woh
box jo number 72 rakhta hai matlab letter H.
Ek char array in boxes ki ek row hai jo memory mein side by side baithte hain, har ek ke paas ek
address (ek ghar ka number) hota hai. char c[10] = 10 boxes ki ek row.
Definition Null terminator
'\0'
Ek special char jiska number 0 hai. Yeh digit '0' nahi hai (woh number 48 hai). Hum ise
ek box ke roop mein draw karte hain jisme STOP likha ho. Har C string function row mein tab tak chalta rehta hai jab tak yeh
box nahi milta. STOP box nahi = function un boxes mein chalta rehta hai jo tumhare nahi hain.
Hamara running example, jo neeche har figure mein use hoga:
char c [ 10 ] = "ab" ; // hum karenge strcat(c, "cd") aur milega "abcd"
char src [ 3 ] = "cd" ; // woh chhoti string jise hum append karenge
Hum c ke saare 10 boxes aur src ke saare 3 boxes unke real ASCII numbers ke saath likhte hain,
taaki kuch bhi invisible na rahe.
char c[10] = "ab"; box 0 ko a se, box 1 ko b se, box 2 ko STOP se bharta hai, aur — kyunki
array text se bada hai — boxes 3–9 ko leftover junk ke roop mein chhodta hai (jo bhi memory mein pehle se tha).
Intuition YEH KYUN maayane rakhta hai
C strings ki puri trick yeh hai ki array size (10) aur string length (2) do
alag numbers hain . strcat STOP box ki parwah karta hai, box 9 ki nahi.
strcat(dst, src) dst ke end mein append karna chahta hai. Lekin dst sirf ek address hai —
start box. Kuch nahi batata ki text kahan rukta hai. Toh sabse pehli cheez jo yeh karta hai woh hai dst ko
tab tak scan karna jab tak STOP na mile . Yeh exactly strlen hai jo andar chhipa hua hai.
i STOP par kyun land karta hai, uske baad nahi
Hum usi waqt rukते hain jab test fail hota hai, aur yeh STOP box par fail hota hai. Toh i=2 exactly
us purane terminator par point karta hai — jo precisely woh box hai jise hum aage overwrite karna chahte hain. Isliye strcat ki cost
O ( len d s t ) hai: yeh sirf yeh jagah dhundne ke liye poori pehli string ko dobara walk karta hai.
Dekhein Time Complexity yeh samajhne ke liye ki loop mein aisa karne se O ( n 2 ) kyun ho jaata hai.
Ab hum src ko box i=2 se copy karna shuru karte hain. Pehli cheez jo hum likhte hain woh hai src[0] = 'c' purane STOP box ke upar .
Purana terminator jaan-boojhkar destroy ho jaata hai.
Intuition Purana STOP kyun mitana hai
Agar hum dst ka purana STOP rakhte, toh string abhi bhi box 2 par "khatam" hoti aur padhne wale ko
cd kabhi nahi milta. Do words tabhi ek word bante hain jab unke beech koi STOP nahi hota.
Ek STOP jo bilkul end mein bachta hai woh src se aana chahiye.
Hum agla letter copy karte hain, phir agla, har baar dono i (dst mein) aur j (src mein) ko
ek-ek aage badhate hain. Do rows, ek shared rhythm.
Intuition Char ko likhne ke
baad kyun test karte hain
Yeh woh clever part hai jo beginners miss karte hain: hum pehle likhte hain, baad mein sawaal karte hain . Yeh guarantee karta hai
ki STOP box dst mein copy ho jaata hai quit karne se pehle — warna dst mein cd hota lekin
koi terminator nahi, aur har agla strlen end se walk off kar jaata. (Dekhein Undefined Behaviour in C .)
Last step mein hum src ka STOP box dst mein copy karte hain. Assignment ki value 0 hai, toh test
!= '\0' false hai, aur loop khatam hota hai. Ab dst abcd padhta hai aur cleanly terminate karta hai.
Worked example strlen se verify karo
c walk karo: a,b,c,d phir STOP → count = 4 . strlen(c) returns 4. ✔
Parent ke Forecast ne 4 kaha tha — isliye aisa hai.
Agar tum empty string append karo toh? src[0] immediately STOP hai. Hume dikhana hai ki C yeh handle karta hai,
crash nahi karta.
Common mistake "Empty src kuch nahi karta, isliye yeh hamesha free hai"
Kyun sahi lagta hai: content nahi badlta. Trap: strcat ne abhi bhi poora
find-the-end walk dst par pahle (Step 2) chalaya. Loop mein "" ko hazaar baar append karna
abhi bhi dst ka hazaar baar poora scan hai — har baar wasteful O ( n ) kaam.
Ab parent ki warning, draw ki gayi. char buf[6] = "Hi"; lo aur strcat(buf, "there") karo. Joined
word Hithere ko 2 + 5 + 1 = 8 boxes chahiye. buf mein sirf 6 hain. Dekho copy box 5 ke baad kaise march karta hai.
Common mistake Overflow, step by step
strcat ko idea nahi ki buf kitna bada hai — use sirf ek address aur ek src mila. Yeh
H i t h e r likhta hai (boxes 0..5, luck se abhi bhi legal) phir box 6 mein e aur box 7 mein STOP — dono
array ke end ke baad . C zero bounds checks karta hai, toh yeh bas... kar deta hai. Jo bhi boxes 6–7 mein tha
(doosra variable, ek saved return address) ab corrupt ho chuka hai. Woh corrupted neighbour
ek buffer overflow hai — dekhein Buffer Overflow & Memory Safety .
Fix: len+1 ke liye size karo, ya seat-belt snprintf(buf, sizeof buf, "%s%s", a, b) use karo,
jo us box par likhna band kar deta hai jo tumne bataya tha aur hamesha ek STOP chhodta hai.
Yeh single figure strcat(c,"cd") ki poori life stack karta hai: (1) do rows apne STOP boxes ke saath laid out,
(2) arrow dst ko uska STOP dhundne ke liye walk karta hua, (3) woh STOP erase ho raha hai,
(4) cd andar aa raha hai, (5) ek final STOP joined word abcd ko close kar raha hai — saath mein danger
line marked hai jahan ek chhhota buffer apne last legal box ke baad spill karta.
Recall Feynman retelling — ek kahani ki tarah batao
Mailboxes ki do rows imagine karo. Pehli ab spell karti hai aur bilkul baad mein ek lal STOP flag hai,
phir kuch empty spare boxes hain. Doosri cd spell karti hai apne khud ke STOP flag ke saath. Main ek lamba word chahta hoon.
Pehle main row one mein chalta hoon, box by box, jab tak uska STOP flag na mile — woh flag mujhe batata hai "word
yahan khatam hota hai." Main us STOP box par khada hoon. Ab main row two ko row one mein copy karna shuru karta hoon usi
STOP box se shuru karke : main purane flag ke upar c paint karta hoon (seam mein koi flag nahi hona chahiye, warna word bahut jaldi khatam ho jaayega), phir d agale box mein, phir main row two ka STOP flag naye single ending ke roop mein copy karta hoon.
Ho gaya: abcd bilkul end mein exactly ek flag ke saath. Lekin agar row one mein sirf chhe boxes ki jagah hoti aur
mera joined word plus flag aath ki zaroorat hoti, toh main saat aur aath number boxes mein paint karta rehta — woh boxes jo mere
padosi ke hain. C mein koi mera haath nahi rokta. Woh padosi-pe-likhna buffer overflow hai, aur
yeh sab is baat ko bhoolne se aata hai ki STOP flag ke liye ek extra box ki zaroorat hoti hai.
char c[10]="ab"; strcat(c,"cd"); ke baad, string kitne boxes use karti hai aur strlen(c) kya hai? ::: 5 boxes (a b c d STOP); strlen(c) 4 hai (STOP se pehle chars).
dst mein strlen(dst)+strlen(src)+1 kyun hona chahiye? ::: Do words ke letters plus woh ek final STOP terminator; +1 miss karo aur overflow ho jaata hai.
Pointers in C — strcat sirf addresses receive karta hai, isliye woh sizes nahi jaanta.
Arrays vs Pointers — array c[10] compile time par apna size jaanta hai; strcat ke andar pointer nahi jaanta.
Buffer Overflow & Memory Safety — Step 7 classic exploit ka janam hai.
Undefined Behaviour in C — box 9 ke baad likhna UB hai; machine tumhe warn nahi karegi.
Time Complexity — find-the-end walk strcat ko O ( n ) banata hai; loop mein, yeh O ( n 2 ) Shlemiel bug hai.
printf format specifiers — snprintf (safe fix) %s %d %f share karta hai.