Strings in C
C mein koi built-in "string" type nahi hota — string sirf ek char array hai jiske end mein ek special null character '\0' hota hai, jo batata hai string yahi khatam. "Hello" actually memory mein 6 characters leta hai: H, e, l, l, o, \0.
String literal ("Hello") likhte waqt compiler automatically \0 add kar deta hai. Lekin manually char array banate waqt, tumhe khud is baat ka khayal rakhna padta hai ki array mein \0 ke liye jagah ho — warna functions jaise printf("%s") kabhi rukenge nahi (memory mein tab tak padhte rahenge jab tak koi \0 na mile).
Do tareeke se string bana sakte ho: char str[] = "Hello"; (modifiable, stack par) ya char *str = "Hello"; (string literal, jise modify karna undefined behavior hai — read-only memory mein hota hai).
char str1[6] = "Hello"; // H e l l o \0 — 6 bytes
char str2[] = "Hello"; // size khud calculate ho jaati hai (6)
char *str3 = "Hello"; // pointer to string literal (read-only!)
printf("%s\n", str1); // Hello
printf("%c\n", str1[0]); // H
// str3[0] = 'J'; // UNDEFINED BEHAVIOR — literal modify mat karo- String = char array + terminating '\0'
- char arr[] = "text" modifiable hai, char *p = "text" read-only
- \0 na ho to string functions kabhi rukenge nahi — buffer overrun
Multiple strings store karne ke do tareeke hain: char names[3][20] (2D array — fixed row size, har string same max length ki jagah leta hai, chahe use kare ya na kare) ya char *names[3] (array of pointers — har string apni exact required memory leta hai, zyada memory-efficient).
char names1[3][20] = {"Aarav", "Riya", "Zoya"}; // fixed 20 bytes per row
char *names2[3] = {"Aarav", "Riya", "Zoya"}; // har ek apni size ka
printf("%s\n", names1[0]); // Aarav
printf("%s\n", names2[0]); // Aarav (same output, alag memory layout)scanf("%s", str) sirf spaces tak padhta hai (poora sentence nahi le sakta) aur buffer size check nahi karta — dangerous hai. fgets(str, size, stdin) ek poori line (spaces samet) padh sakta hai, aur size limit ke saath safe bhi hai.
char name[50];
// scanf: sirf ek word tak
// scanf("%s", name); // "Aarav Kumar" input do to sirf "Aarav" milega
// fgets: poori line, safe
fgets(name, sizeof(name), stdin); // "Aarav Kumar\n" — poora milega
// fgets newline bhi include kar leta hai — usse hataana pad sakta hai:
name[strcspn(name, "\n")] = '\0';