✂️
Strings

String Manipulation & Safety

Buffer Overflows Se Bachna
💡 strcpy() ek bina size-limit wale glass mein paani daalna hai (overflow ho sakta hai) — strncpy() ek measuring cup se daalna hai (limit fix hai, overflow nahi hoga).

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() ek bina size-limit wale glass mein paani daalna hai (overflow ho sakta hai) — strncpy() ek measuring cup se daalna hai (limit fix hai, overflow nahi hoga).
1 / 2
⚡ झट से Recap
  • 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()
इस page में (2 subtopics)

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;
}
💡Tip: Real-world palindrome checkers usually case-insensitive hote hain aur spaces/punctuation ignore karte hain ("A man a plan a canal Panama") — pehle string ko clean/normalize karo, phir check karo.