String Manipulation & Safety
strcpy() aur strcat() destination buffer ki size CHECK NAHI karte — agar source string bade se bhi bada ho destination array se, ye adjacent memory ko overwrite kar denge ("buffer overflow"), jo crashes aur security vulnerabilities ka bahut bada source hai (real-world hacks mein bhi use hota hai).
Safer alternatives: strncpy(dest, src, n) aur strncat(dest, src, n) — ye ek maximum character limit (n) leta hai, isse zyada copy nahi karega. Lekin inka bhi ek gotcha hai: agar source, n se lamba hai, strncpy() null-terminator add NAHI karta — manually add karna padta hai.
char dest[10];
// UNSAFE:
// strcpy(dest, "This is a very long string"); // buffer overflow!
// SAFER:
strncpy(dest, "This is a very long string", 9);
dest[9] = '\0'; // manually null-terminate — strncpy guarantee nahi karta
printf("%s\n", dest); // "This is a" (truncated, safely)- strcpy/strcat buffer size check nahi karte — overflow risk
- strncpy/strncat safer hain, lekin \0 khud add karna pad sakta hai
- User input ke liye kabhi gets() use mat karo — hamesha fgets()
Ek classic C interview problem — string ko reverse karna bina extra memory use kiye, do pointers (ek shuru se, ek end se) ko aage-peeche move karke aur swap karte hue.
void reverse(char *str) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
int main() {
char str[] = "Hello";
reverse(str);
printf("%s\n", str); // "olleH"
return 0;
}Palindrome check reverse-string logic ka hi extension hai — bas swap karne ki jagah, compare karo. Agar sab characters match karein (front se aur back se), string palindrome hai.
int isPalindrome(char *str) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
if (str[left] != str[right]) return 0; // 0 = false
left++;
right--;
}
return 1; // 1 = true
}
int main() {
printf("%d\n", isPalindrome("madam")); // 1
printf("%d\n", isPalindrome("hello")); // 0
return 0;
}