āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (String Input) āđƒāļ™āļ āļēāļĐāļē C: āļ„āļđāđˆāļĄāļ·āļ­āļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āđ€āļ—āļ„āļ™āļīāļ„āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

į›ŪæŽĄ

1. āļšāļ—āļ™āļģ

āļ āļēāļĐāļē C āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡ â€œāļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (string input)” āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ‚āļēāļ”āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđ‰āļ­āļ‡āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰ āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļˆāļ°āļ­āļ˜āļīāļšāļēāļĒāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ§āļīāļ˜āļĩāļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļ āļēāļĐāļē C āļžāļĢāđ‰āļ­āļĄāđāļ™āļ°āļ™āļģāđ€āļ—āļ„āļ™āļīāļ„āđāļĨāļ°āļ‚āđ‰āļ­āļ„āļ§āļĢāļĢāļ°āļ§āļąāļ‡āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āļĄāļąāļāļˆāļ°āļŠāļąāļšāļŠāļ™āļāļąāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļˆāļ°āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļ•āļąāđ‰āļ‡āđāļ•āđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ„āļļāļ“āļžāļąāļ’āļ™āļēāļ—āļąāļāļĐāļ°āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡āđ„āļ”āđ‰

āļŦāļēāļāļ„āļļāļ“āđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļ āļēāļĐāļē C āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡āđāļĨāļ°āļ›āļĨāļ­āļ”āļ āļąāļĒ āļ„āļļāļ“āļāđ‡āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļāđ‰āļēāļ§āđ„āļ›āļŠāļđāđˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™āđ„āļ”āđ‰ āļ™āļąāđˆāļ™āđāļĨāđ‰āļ§ āđ€āļĢāļēāļĄāļēāđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļāļąāļ™āđ€āļĨāļĒ

2. āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļ āļēāļĐāļē C āļ„āļ·āļ­āļ­āļ°āđ„āļĢ? āļ­āļ˜āļīāļšāļēāļĒāđāļ™āļ§āļ„āļīāļ”āļžāļ·āđ‰āļ™āļāļēāļ™

āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (String) āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

āđƒāļ™āļ āļēāļĐāļē C āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (string) āļˆāļ°āđāļ—āļ™āļ”āđ‰āļ§āļĒāļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļļāļāļŠāļļāļ”āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļŠāļīāđ‰āļ™āļŠāļļāļ” â€œ ” āļ­āļĒāļđāđˆāļ—āđ‰āļēāļĒāđ€āļŠāļĄāļ­ āđ€āļžāļ·āđˆāļ­āļšāļ­āļāļ§āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŠāļīāđ‰āļ™āļŠāļļāļ”āđāļĨāđ‰āļ§ āļ”āđ‰āļ§āļĒāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļ āļēāļĐāļē C āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ„āļ§āļēāļĄāļĒāļēāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™

āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļāļąāļšāļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒ

āđƒāļ™āļ āļēāļĐāļē C āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļĢāļīāļ‡ āđ† āđāļĨāđ‰āļ§āļ„āļ·āļ­āļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļŠāļ™āļīāļ” char āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰:

char str[10];  // āđ€āļ•āļĢāļĩāļĒāļĄ buffer āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” 10 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ

āđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰ āļˆāļ°āļĄāļĩāļāļēāļĢāļˆāļ­āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” 10 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āđāļ•āđˆ 1 āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļŠāļīāđ‰āļ™āļŠāļļāļ” â€œ ” āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļģāļ™āļ§āļ™āļ­āļąāļāļĐāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡āđ„āļ”āđ‰āļ„āļ·āļ­ 9 āļ•āļąāļ§

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĨāļīāđ€āļ—āļ­āļĢāļąāļĨ

āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĨāļīāđ€āļ—āļ­āļĢāļąāļĨ āļ„āļ·āļ­ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļ„āļĢāļ­āļšāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ double quotes (” “) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™:

char greeting[] = "Hello";

āđƒāļ™āļāļĢāļ“āļĩāļ™āļĩāđ‰ greeting āļˆāļ°āļ–āļđāļāļˆāļąāļ”āļāļēāļĢāđ€āļ›āđ‡āļ™āļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļ‚āļ™āļēāļ” 6 (“Hello” + āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļŠāļīāđ‰āļ™āļŠāļļāļ”) āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī

āđ€āļŦāļ•āļļāļœāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ

āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļŦāļĨāļēāļĒāļāļĢāļ“āļĩāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰ āđ€āļŠāđˆāļ™ āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāļ·āđˆāļ­āđāļĨāļ°āļ—āļĩāđˆāļ­āļĒāļđāđˆ āļāļēāļĢāļ›āđ‰āļ­āļ™āļ„āļģāļ„āđ‰āļ™āļŦāļē āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ‚āļēāļ”āđ„āļĄāđˆāđ„āļ”āđ‰āđƒāļ™āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļŸāļ‹āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļ

äūã‚Ļãƒģã‚ļニã‚ĒåĄū

3. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™

3-1. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ scanf

āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ scanf

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ scanf āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ­āļīāļ™āļžāļļāļ•āļĄāļēāļ•āļĢāļāļēāļ™ (āđāļ›āđ‰āļ™āļžāļīāļĄāļžāđŒ) āđ€āļĄāļ·āđˆāļ­āļĢāļąāļšāļ„āđˆāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļ°āđƒāļŠāđ‰āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļĢāļđāļ›āđāļšāļš %s

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

#include <stdio.h>

int main() {
    char str[50];  // buffer āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” 50 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    scanf("%s", str);  // āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļēāļāļ­āļīāļ™āļžāļļāļ•āļĄāļēāļ•āļĢāļāļēāļ™
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđāļĨāđ‰āļ§āđāļŠāļ”āļ‡āļœāļĨāļ­āļ­āļāļĄāļēāļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­

āļ‚āđ‰āļ­āļ„āļ§āļĢāļĢāļ°āļ§āļąāļ‡āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰ scanf

  1. āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ„āļ”āđ‰:
    āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ scanf āļˆāļ°āļ–āļ·āļ­āļ§āđˆāļēāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ (space, tab, newline) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļšāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŦāļēāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļˆāļ°āļ–āļđāļāļ•āļąāļ”āļ­āļ­āļāļāļĨāļēāļ‡āļ„āļąāļ™

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:
āļ­āļīāļ™āļžāļļāļ•:

Hello World

āđ€āļ­āļēāļ•āđŒāļžāļļāļ•:

Hello
  1. āđ€āļŠāļĩāđˆāļĒāļ‡āļ•āđˆāļ­ Buffer Overflow:
    āļŦāļēāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļĒāļēāļ§āđ€āļāļīāļ™āļ‚āļ™āļēāļ” buffer āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļŠāļĩāļĒāļŦāļēāļĒ āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāđˆāļĄāļŦāļĢāļ·āļ­āđ€āļāļīāļ”āļŠāđˆāļ­āļ‡āđ‚āļŦāļ§āđˆāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

āļ§āļīāļ˜āļĩāđāļāđ‰:
āļ„āļ§āļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļāļ§āđˆāļē āđ€āļŠāđˆāļ™ fgets (āļ­āļ˜āļīāļšāļēāļĒāđƒāļ™āļ āļēāļĒāļŦāļĨāļąāļ‡)

3-2. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ fgets

āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ fgets

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ fgets āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āļˆāļģāļ™āļ§āļ™āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļŠāļđāļ‡āļŠāļļāļ”āļ—āļĩāđˆāļĢāļąāļšāđ„āļ”āđ‰ āļĢāļ§āļĄāļ–āļķāļ‡āļĢāļąāļš newline āļ”āđ‰āļ§āļĒ āļ—āļģāđƒāļŦāđ‰āđ„āļĄāđˆāđ€āļāļīāļ”āļ›āļąāļāļŦāļē buffer overflow

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

#include <stdio.h>

int main() {
    char str[50];  // buffer āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” 50 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    fgets(str, sizeof(str), stdin);  // āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s", str);
    return 0;
}

āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” 50 āļ•āļąāļ§āļ­āļąāļāļĐāļĢāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļ­āļ­āļāļĄāļēāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

āļ‚āđ‰āļ­āļ”āļĩāļ‚āļ­āļ‡ fgets

  1. āļ›āđ‰āļ­āļ‡āļāļąāļ™ Buffer Overflow: āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ” buffer āđ„āļ”āđ‰
  2. āļĢāļ­āļ‡āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡: āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļš space āđāļĨāļ° tab āđ„āļ”āđ‰

āļ‚āđ‰āļ­āļ„āļ§āļĢāļĢāļ°āļ§āļąāļ‡āļ‚āļ­āļ‡ fgets

  1. āļ›āļąāļāļŦāļēāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđƒāļŦāļĄāđˆ: āļ„āđˆāļēāļ—āļĩāđˆāļĢāļąāļšāļĄāļēāļˆāļ°āļĄāļĩ newline āļ­āļĒāļđāđˆāļ—āđ‰āļēāļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđ€āļāļīāļ™āļĄāļē

āļ§āļīāļ˜āļĩāļĨāļš newline:

str[strcspn(str, "\n")] = '\0';
  1. āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļāļ„āđ‰āļēāļ‡āđƒāļ™ buffer: āļŦāļēāļāđƒāļŠāđ‰ fgets āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļšāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ·āđˆāļ™ āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļˆāļ°āļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļāļ„āđ‰āļēāļ‡ āļ§āļīāļ˜āļĩāđāļāđ‰āļ„āļ·āļ­āđƒāļŠāđ‰ fflush(stdin) āļŦāļĢāļ·āļ­ getchar() āđ€āļžāļ·āđˆāļ­āļĨāđ‰āļēāļ‡ buffer

3-3. āļ„āļ§āļĢāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđāļšāļšāđ„āļŦāļ™?

āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļ­āļ„āļ§āļĢāļĢāļ°āļ§āļąāļ‡
scanfāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŠāļąāđ‰āļ™ āđ† āļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ€āļŠāļĩāđˆāļĒāļ‡āļ•āđˆāļ­ buffer overflow āđāļĨāļ°āđ„āļĄāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡
fgetsāļ›āļĨāļ­āļ”āļ āļąāļĒ āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢ newline āđāļĨāļ°āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ•āđ‰āļ­āļ‡āļĨāđ‰āļēāļ‡ buffer

āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŦāļĢāļ·āļ­āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđƒāļŠāđ‰ fgets

4. āđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

4-1. āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ Buffer Overflow

Buffer Overflow āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

Buffer Overflow āļ„āļ·āļ­āļ›āļąāļāļŦāļēāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļīāļ™āļāļ§āđˆāļēāļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (buffer) āļ—āļĩāđˆāļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰ āļ—āļģāđƒāļŦāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāđ‰āļ™āđ„āļ›āļ—āļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāđˆāļ§āļ™āļ­āļ·āđˆāļ™ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāđˆāļĄāļŦāļĢāļ·āļ­āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļŠāđˆāļ­āļ‡āđ‚āļŦāļ§āđˆāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ:

char str[10];
scanf("%s", str);  // āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ”āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™

āļŦāļēāļāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ€āļāļīāļ™ 10 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āļˆāļ°āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ” Buffer Overflow

āļ§āļīāļ˜āļĩāđāļāđ‰ 1: āđƒāļŠāđ‰ fgets

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ fgets āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ” buffer āđāļĨāļ°āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļīāļ™āđ„āļ”āđ‰

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ:

#include <stdio.h>
#include <string.h>

int main() {
    char str[10];
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āđƒāļ™āđ‚āļ„āđ‰āļ”āļ™āļĩāđ‰ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļ°āļ–āļđāļāļˆāļģāļāļąāļ”āđ„āļ§āđ‰āđ„āļĄāđˆāđ€āļāļīāļ™ 10 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āđāļĨāļ° newline āļˆāļ°āļ–āļđāļāļĨāļšāļ­āļ­āļ

āļ§āļīāļ˜āļĩāđāļāđ‰ 2: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļĒāļēāļ§āļ­āļīāļ™āļžāļļāļ•

āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ€āļāļīāļ™āļāļ§āđˆāļēāļ—āļĩāđˆāļ„āļēāļ”āđ„āļ§āđ‰ āļ„āļ§āļĢāđāļŠāļ”āļ‡āļ„āļģāđ€āļ•āļ·āļ­āļ™āđāļĨāļ°āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

#include <stdio.h>
#include <string.h>

int main() {
    char str[10];
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (āđ„āļĄāđˆāđ€āļāļīāļ™ 9 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ): ");
    fgets(str, sizeof(str), stdin);
    if (strlen(str) >= sizeof(str) - 1 && str[strlen(str) - 1] != '\n') {
        printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļĒāļēāļ§āđ€āļāļīāļ™āđ„āļ›\n");
        return 1;  // āļˆāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āđ‰āļ§āļĒ error
    }
    str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļĒāļēāļ§āđāļĨāļ°āļŦāļĒāļļāļ”āļŦāļēāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļāļīāļ™āļāļģāļŦāļ™āļ”

4-2. āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” (Error Handling)

āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”

āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļŠāļģāļ„āļąāļāđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ€āļĄāļ·āđˆāļ­āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļ‹āļķāđˆāļ‡āļ­āļēāļˆāđ„āļĄāđˆāđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļ—āļĩāđˆāļ„āļēāļ”āđ„āļ§āđ‰

āļ§āļīāļ˜āļĩāđāļāđ‰ 1: āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āđƒāļŦāļĄāđˆ (Retry)

āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āļ„āļ§āļĢāđƒāļŦāđ‰āđ‚āļ­āļāļēāļŠāđƒāļ™āļāļēāļĢāļ›āđ‰āļ­āļ™āđƒāļŦāļĄāđˆ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

#include <stdio.h>
#include <string.h>

int main() {
    char str[10];
    int valid = 0;

    while (!valid) {
        printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (āđ„āļĄāđˆāđ€āļāļīāļ™ 9 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ): ");
        fgets(str, sizeof(str), stdin);

        if (strlen(str) >= sizeof(str) - 1 && str[strlen(str) - 1] != '\n') {
            printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ€āļāļīāļ™āđ„āļ› āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āđƒāļŦāļĄāđˆ\n");
            while (getchar() != '\n');  // āļĨāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļāļ„āđ‰āļēāļ‡āđƒāļ™ buffer
        } else {
            str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline
            valid = 1;  // āļ­āļīāļ™āļžāļļāļ•āļ–āļđāļāļ•āđ‰āļ­āļ‡
        }
    }

    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ§āļ™āļĨāļđāļ›āļˆāļ™āļāļ§āđˆāļēāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡

āļ§āļīāļ˜āļĩāđāļāđ‰ 2: āļāļēāļĢāļāļĢāļ­āļ‡āļ­āļīāļ™āļžāļļāļ• (Input Filtering)

āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļēāļ•āļĢāļ‡āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļāļģāļŦāļ™āļ” āđ€āļŠāđˆāļ™ āļĢāļąāļšāđ€āļ‰āļžāļēāļ°āļ•āļąāļ§āđ€āļĨāļ‚āļŦāļĢāļ·āļ­āļ•āļąāļ§āļ­āļąāļāļĐāļĢ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int isValidInput(const char *str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (!isalnum(str[i])) {  // āļ­āļ™āļļāļāļēāļ•āđ€āļ‰āļžāļēāļ°āļ•āļąāļ§āļ­āļąāļāļĐāļĢāđāļĨāļ°āļ•āļąāļ§āđ€āļĨāļ‚
            return 0;
        }
    }
    return 1;
}

int main() {
    char str[50];
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (āđ€āļ‰āļžāļēāļ°āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚): ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';

    if (isValidInput(str)) {
        printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    } else {
        printf("āļ­āļīāļ™āļžāļļāļ•āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡\n");
    }

    return 0;
}

āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ­āļ™āļļāļāļēāļ•āđ€āļ‰āļžāļēāļ°āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™

5. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ

5-1. āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰ āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļ·āļ­:

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

char str[50];
gets(str);  // āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļēāļāļ­āļīāļ™āļžāļļāļ•āļĄāļēāļ•āļĢāļāļēāļ™

āđāļĄāđ‰āļˆāļ°āļ”āļđāđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ āđāļ•āđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļĄāļĩāļ›āļąāļāļŦāļēāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ­āļąāļ™āļ•āļĢāļēāļĒ

āļ›āļąāļāļŦāļēāļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets

  1. āđ€āļŠāļĩāđˆāļĒāļ‡āļ•āđˆāļ­ Buffer Overflow:
    āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļˆāļģāļāļąāļ”āļ„āļ§āļēāļĄāļĒāļēāļ§āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĢāļąāļšāđ€āļ‚āđ‰āļēāļĄāļē āļŦāļēāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ€āļāļīāļ™ buffer āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ—āļąāļšāđāļĨāļ°āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

char str[10];
gets(str);  // āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ”āļ­āļīāļ™āļžāļļāļ•

āļŦāļēāļāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ 20 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļēāļˆāļĨāđˆāļĄāđāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļŠāļĩāļĒāļŦāļēāļĒ

  1. āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ:
    Buffer Overflow āļ­āļēāļˆāļ–āļđāļāđ‚āļˆāļĄāļ•āļĩāđ‚āļ”āļĒāđ€āļˆāļ•āļ™āļē (Buffer Overflow Attack) āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ–āļđāļāļĒāļķāļ”āļ„āļĢāļ­āļ‡
  2. āļ–āļđāļāļĒāļāđ€āļĨāļīāļāļˆāļēāļāļĄāļēāļ•āļĢāļāļēāļ™:
    āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļ–āļđāļāļ›āļĢāļ°āļāļēāļĻāļ§āđˆāļē “āđ„āļĄāđˆāļ„āļ§āļĢāđƒāļŠāđ‰â€ āļ•āļąāđ‰āļ‡āđāļ•āđˆ C99 āđāļĨāļ°āļ–āļđāļāļĨāļšāļ­āļ­āļāļˆāļēāļāļĄāļēāļ•āļĢāļāļēāļ™ C11 āļ—āļģāđƒāļŦāđ‰āļ„āļ­āļĄāđ„āļžāđ€āļĨāļ­āļĢāđŒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđāļŠāļ”āļ‡ Warning āļŦāļĢāļ·āļ­ Error āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™

5-2. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļ—āļ™ gets

āđƒāļŠāđ‰ fgets āđāļ—āļ™

āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰ gets āļ„āļ§āļĢāđƒāļŠāđ‰ fgets āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ Buffer Overflow

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ:

#include <stdio.h>
#include <string.h>

int main() {
    char str[50];
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    fgets(str, sizeof(str), stdin);  // āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ
    str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļš scanf

āđāļĄāđ‰ scanf āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰ āđāļ•āđˆāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđāļĨāļ°āđ€āļŠāļĩāđˆāļĒāļ‡āļ•āđˆāļ­ Buffer Overflow āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļŦāļĢāļ·āļ­āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āļ„āļ§āļĢāđƒāļŠāđ‰ fgets

āļāļēāļĢāđƒāļŠāđ‰ getline

āđƒāļ™āļĢāļ°āļšāļšāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļĄāļēāļ•āļĢāļāļēāļ™ POSIX āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ getline āļ‹āļķāđˆāļ‡āļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš dynamic āļ—āļģāđƒāļŦāđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ” buffer

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *line = NULL;
    size_t len = 0;
    ssize_t read;

    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    read = getline(&line, &len, stdin);  // āļˆāļąāļ”āļŠāļĢāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī

    if (read != -1) {
        printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s", line);
    }

    free(line);  // āļ„āļ·āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
    return 0;
}

āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđāļ™āļ°āļ™āļģ

āđƒāļ™āļ āļēāļĐāļē C āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļšāļēāļ‡āļ•āļąāļ§āļ­āļēāļˆāļ–āļđāļāđ€āļĨāļīāļāđƒāļŠāđ‰āđ€āļžāļĢāļēāļ°āđ„āļĄāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļ­āļīāļ™āļžāļļāļ•āļˆāļēāļāļ āļēāļĒāļ™āļ­āļ āļ‹āļķāđˆāļ‡āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļŠāļđāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļ§āļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļāļ§āđˆāļē āđ€āļŠāđˆāļ™ fgets āļŦāļĢāļ·āļ­ getline

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđāļ™āļ°āļ™āļģāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđāļ—āļ™āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļŦāļĨāļąāļ
getsfgetsāļ›āļĨāļ­āļ”āļ āļąāļĒ āļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰
getsgetlineāļĢāļ­āļ‡āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§ āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš dynamic
scanf("%s")fgetsāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

6. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒï―œāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ

6-1. āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”

āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”

āđƒāļ™āļšāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļœāļđāđ‰āđƒāļŠāđ‰āļ­āļēāļˆāļ•āđ‰āļ­āļ‡āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”āđāļĨāļ°āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āđ€āļŠāđˆāļ™ āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Notepad) āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ›āđ‰āļ­āļ™āļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 1: āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ 3 āļšāļĢāļĢāļ—āļąāļ”

#include <stdio.h>
#include <string.h>

#define MAX_LINES 3     // āļˆāļģāļ™āļ§āļ™āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļĢāļąāļš
#define MAX_LENGTH 100  // āļˆāļģāļ™āļ§āļ™āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļŠāļđāļ‡āļŠāļļāļ”āļ•āđˆāļ­āļšāļĢāļĢāļ—āļąāļ”

int main() {
    char lines[MAX_LINES][MAX_LENGTH];  // āļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļŠāļ­āļ‡āļĄāļīāļ•āļīāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ

    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ %d āļšāļĢāļĢāļ—āļąāļ”:\n", MAX_LINES);

    for (int i = 0; i < MAX_LINES; i++) {
        printf("āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ %d: ", i + 1);
        fgets(lines[i], sizeof(lines[i]), stdin);
        lines[i][strcspn(lines[i], "\n")] = '\0';  // āļĨāļš newline
    }

    printf("\nāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™:\n");
    for (int i = 0; i < MAX_LINES; i++) {
        printf("āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ %d: %s\n", i + 1, lines[i]);
    }

    return 0;
}

āļˆāļļāļ”āļŠāļģāļ„āļąāļ:

  1. āđƒāļŠāđ‰āļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļŠāļ­āļ‡āļĄāļīāļ•āļī: āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļ•āđˆāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”āđāļĒāļāļāļąāļ™
  2. āđƒāļŠāđ‰ fgets āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ: āļˆāļģāļāļąāļ”āļˆāļģāļ™āļ§āļ™āļ•āļąāļ§āļ­āļąāļāļĐāļĢ āđāļĨāļ°āļĨāļš newline
  3. āđƒāļŠāđ‰ for-loop: āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”āđ„āļ”āđ‰āļŠāļ°āļ”āļ§āļ

āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™:

āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ 3 āļšāļĢāļĢāļ—āļąāļ”:
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 1: Hello
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 2: World
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 3: C Language

āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™:
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 1: Hello
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 2: World
āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ 3: C Language

6-2. āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļŦāļĢāļ·āļ­āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡

āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļ„āļ§āļĢāđƒāļŠāđ‰ fgets

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 2: āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļžāļĢāđ‰āļ­āļĄāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡

#include <stdio.h>
#include <string.h>

int main() {
    char str[100];  // buffer āļŠāļđāļ‡āļŠāļļāļ” 100 āļ•āļąāļ§āļ­āļąāļāļĐāļĢ

    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline

    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);
    return 0;
}

āļˆāļļāļ”āļŠāļģāļ„āļąāļ:

  • āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļŦāļĢāļ·āļ­ tab āđ„āļ”āđ‰
  • āļĨāļš newline āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđ€āļāļīāļ™

āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™:

āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: Hello World with spaces
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: Hello World with spaces

6-3. āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐāđāļĨāļ° Escape Sequence

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ

āđƒāļ™āļ āļēāļĐāļē C āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢāļāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļžāļīāđ€āļĻāļĐāļŦāļĢāļ·āļ­ Escape Sequence āđ€āļŠāđˆāļ™ \n, \t

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 3: āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļĢāļ§āļˆāļˆāļąāļšāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char str[100];
    int specialCharCount = 0;

    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline

    for (int i = 0; str[i] != '\0'; i++) {
        if (!isalnum(str[i]) && !isspace(str[i])) {  // āļ•āļĢāļ§āļˆāļˆāļąāļšāļ•āļąāļ§āļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚
            specialCharCount++;
        }
    }

    printf("āļˆāļģāļ™āļ§āļ™āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ: %d\n", specialCharCount);
    return 0;
}

āļˆāļļāļ”āļŠāļģāļ„āļąāļ:

  • āđƒāļŠāđ‰ isalnum āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚
  • āđƒāļŠāđ‰ isspace āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡
  • āļ­āļąāļāļ‚āļĢāļ°āļ­āļ·āđˆāļ™āļˆāļ°āļ–āļđāļāļ™āļąāļšāđ€āļ›āđ‡āļ™āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ

āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™:

āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: Hello, World! 123
āļˆāļģāļ™āļ§āļ™āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ: 2

6-4. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ: āđ‚āļ›āļĢāđāļāļĢāļĄ Notepad āđāļšāļšāļ‡āđˆāļēāļĒ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļĢāļ§āļĄāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”āđāļĨāļ°āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļĨāļ‡āđ„āļŸāļĨāđŒ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 4: āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Memo)

#include <stdio.h>
#include <string.h>

#define MAX_LINES 5
#define MAX_LENGTH 100

int main() {
    char lines[MAX_LINES][MAX_LENGTH];

    printf("āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļšāļąāļ™āļ—āļķāļāđ„āļ”āđ‰āļŠāļđāļ‡āļŠāļļāļ” %d āļšāļĢāļĢāļ—āļąāļ”\n", MAX_LINES);
    for (int i = 0; i < MAX_LINES; i++) {
        printf("āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆ %d: ", i + 1);
        fgets(lines[i], sizeof(lines[i]), stdin);
        lines[i][strcspn(lines[i], "\n")] = '\0';
    }

    FILE *file = fopen("memo.txt", "w");
    if (file == NULL) {
        printf("āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāđ„āļ”āđ‰\n");
        return 1;
    }

    for (int i = 0; i < MAX_LINES; i++) {
        fprintf(file, "%s\n", lines[i]);
    }

    fclose(file);
    printf("āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§\n");
    return 0;
}

āļˆāļļāļ”āļŠāļģāļ„āļąāļ:

  • āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒ
  • āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāđ„āļŸāļĨāđŒ

7. āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ (Q&A)

Q1: āļ—āļģāđ„āļĄāđ„āļĄāđˆāļ„āļ§āļĢāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets?

A:
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ gets āļˆāļ°āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāļāļąāļ”āļ„āļ§āļēāļĄāļĒāļēāļ§ āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡ Buffer Overflow āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ­āļ‡āđ‚āļŦāļ§āđˆāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļĄāļēāļ•āļĢāļāļēāļ™ C11 āļˆāļķāļ‡āđ„āļ”āđ‰āļĒāļāđ€āļĨāļīāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āđ„āļ›āđāļĨāđ‰āļ§ āļ„āļ§āļĢāđƒāļŠāđ‰ fgets āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļāļ§āđˆāļēāđāļ—āļ™

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ:

char str[50];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';  // āļĨāļš newline

Q2: āļ—āļģāđ„āļĄ scanf āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ„āļ”āđ‰?

A:
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ scanf āļˆāļ°āļ–āļ·āļ­āļ§āđˆāļē space, tab, newline āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļšāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŦāļēāļāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļˆāļ°āļ–āļđāļāļ•āļąāļ”āļ­āļ­āļ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡:
āļ­āļīāļ™āļžāļļāļ•:

Hello World

āđ€āļ­āļēāļ•āđŒāļžāļļāļ•:

Hello

āļ§āļīāļ˜āļĩāđāļāđ‰: āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļ„āļ§āļĢāđƒāļŠāđ‰ fgets

char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);

Q3: āļ–āđ‰āļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļĒāļēāļ§āđ€āļāļīāļ™āļ‚āļ™āļēāļ” buffer āļ‚āļ­āļ‡ fgets āļˆāļ°āļ—āļģāļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

A:
fgets āļˆāļ°āļ•āļąāļ”āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļŦāđ‰āļžāļ­āļ”āļĩāļāļąāļšāļ‚āļ™āļēāļ” buffer āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļāļīāļ™āļˆāļ°āđ„āļĄāđˆāļ–āļđāļāđ€āļāđ‡āļš

āļ§āļīāļ˜āļĩāđāļāđ‰:

  1. āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļ­āļīāļ™āļžāļļāļ•āļĒāļēāļ§āđ€āļāļīāļ™
  2. āđƒāļŠāđ‰ getline āļ‹āļķāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš dynamic (āđƒāļŠāđ‰āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļšāļš POSIX)

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *line = NULL;
    size_t len = 0;
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    getline(&line, &len, stdin);  // āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s", line);
    free(line);
    return 0;
}

Q4: āļˆāļ°āļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļē newline āļ—āļĩāđˆ fgets āđ€āļāđ‡āļšāļĄāļēāļ”āđ‰āļ§āļĒāļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

A:
fgets āļˆāļ°āđ€āļāđ‡āļš newline āļĄāļēāļ”āđ‰āļ§āļĒ āļ—āļģāđƒāļŦāđ‰āđ€āļ§āļĨāļēāđāļŠāļ”āļ‡āļœāļĨāđ€āļāļīāļ”āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđ€āļāļīāļ™

āļ§āļīāļ˜āļĩāđāļāđ‰: āļĨāļš newline āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡

char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);

Q5: āļ–āđ‰āļē fgets āđ€āļŦāļĨāļ·āļ­āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļāļ„āđ‰āļēāļ‡āđƒāļ™ buffer āļˆāļ°āļ—āļģāļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

A:
āļŦāļēāļāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āđ€āļāļīāļ™ buffer āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļˆāļ°āļ„āđ‰āļēāļ‡āđƒāļ™ buffer āļ§āļīāļ˜āļĩāđāļāđ‰āļ„āļ·āļ­āđƒāļŠāđ‰ getchar āđ€āļžāļ·āđˆāļ­āļĨāđ‰āļēāļ‡

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

char str[10];
fgets(str, sizeof(str), stdin);

if (strchr(str, '\n') == NULL) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);  // āļ­āđˆāļēāļ™āļ—āļīāđ‰āļ‡āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āđ€āļˆāļ­ newline
}

printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s\n", str);

Q6: āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļĢāļąāļšāđ€āļ‰āļžāļēāļ°āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚āļ—āļģāđ„āļ”āđ‰āđ„āļŦāļĄ?

A:
āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āļ•āļĢāļ§āļˆāļŠāļ­āļš (filter) āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ›āļāļīāđ€āļŠāļ˜āļ•āļąāļ§āļ­āļąāļāļĐāļĢāļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāļ•āļąāļ§āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int isValidInput(const char *str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (!isalnum(str[i])) {
            return 0;  // āļžāļšāļ­āļąāļāļ‚āļĢāļ°āļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāļ•āļąāļ§āđ€āļĨāļ‚āļŦāļĢāļ·āļ­āļ•āļąāļ§āļ­āļąāļāļĐāļĢ
        }
    }
    return 1;
}

int main() {
    char str[50];
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (āđ€āļ‰āļžāļēāļ°āļ­āļąāļāļĐāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđ€āļĨāļ‚): ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';

    if (isValidInput(str)) {
        printf("āļ­āļīāļ™āļžāļļāļ•āļ–āļđāļāļ•āđ‰āļ­āļ‡: %s\n", str);
    } else {
        printf("āļ­āļīāļ™āļžāļļāļ•āđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡\n");
    }
    return 0;
}

Q7: āļ–āđ‰āļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§āļĄāļēāļāđ€āļāļīāļ™ buffer āļˆāļ°āļĢāļąāļšāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?

A:
āđƒāļ™āļāļĢāļ“āļĩāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰ getline āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡: āđƒāļŠāđ‰ getline (POSIX)

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *line = NULL;
    size_t len = 0;
    printf("āļāļĢāļļāļ“āļēāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: ");
    getline(&line, &len, stdin);
    printf("āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļ·āļ­: %s", line);
    free(line);
    return 0;
}

8. āļŠāļĢāļļāļ›

āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļ āļēāļĐāļē C āļ•āļąāđ‰āļ‡āđāļ•āđˆāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™ āđ‚āļ”āļĒāļœāļđāđ‰āļ­āđˆāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ§āļīāļ˜āļĩāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļāļ‚āļķāđ‰āļ™

1. āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ

āđƒāļ™āļ āļēāļĐāļē C āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (string) āļ–āļđāļāđ€āļāđ‡āļšāđ€āļ›āđ‡āļ™āļ­āļēāļĢāđŒāđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļŠāļ™āļīāļ” char āđāļĨāļ°āļŠāļīāđ‰āļ™āļŠāļļāļ”āļ”āđ‰āļ§āļĒāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ '\0' āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ™āļĩāđ‰āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡

2. āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļĒāđˆāļēāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄ

  • scanf: āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒāđāļ•āđˆāđ„āļĄāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āđāļĨāļ°āđ€āļŠāļĩāđˆāļĒāļ‡āļ•āđˆāļ­ Buffer Overflow
  • fgets: āļ›āļĨāļ­āļ”āļ āļąāļĒ āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļ„āļ§āļēāļĄāļĒāļēāļ§āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļšāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļāļēāļĢ newline
  • getline: āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĒāļēāļ§ āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī (āđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļ‰āļžāļēāļ°āļĢāļ°āļšāļš POSIX)

3. āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāđāļĨāļ°āļ›āļĨāļ­āļ”āļ āļąāļĒ āļ„āļ§āļĢāļ›āļāļīāļšāļąāļ•āļīāļ”āļąāļ‡āļ™āļĩāđ‰:

  1. āļˆāļąāļ”āļāļēāļĢāļ‚āļ™āļēāļ” buffer: āļ›āđ‰āļ­āļ‡āļāļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāđ‰āļ™
  2. āļĨāļš newline: āļ—āļģāļ„āļ§āļēāļĄāļŠāļ°āļ­āļēāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļīāļ™āļžāļļāļ•
  3. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļīāļ™āļžāļļāļ•: āļāļĢāļ­āļ‡āļ„āđˆāļēāļ—āļĩāđˆāđ„āļĄāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡ āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ›āđ‰āļ­āļ™āđƒāļŦāļĄāđˆ

4. āļāļķāļāļ—āļąāļāļĐāļ°āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ

āļœāđˆāļēāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ āļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ” āđāļĨāļ°āļāļēāļĢāļšāļąāļ™āļ—āļķāļāđ„āļŸāļĨāđŒ āļ—āļģāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļˆāļĢāļīāļ‡ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļķāđ‰āļ™

5. āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāđāļĨāļ°āļ§āļīāļ˜āļĩāđāļāđ‰āđ„āļ‚

āđƒāļ™āļŠāđˆāļ§āļ™ Q&A āđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļˆāļ­āļšāđˆāļ­āļĒ āđ€āļŠāđˆāļ™:

  • āļ­āļąāļ™āļ•āļĢāļēāļĒāļˆāļēāļ gets āđāļĨāļ°āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļāļ§āđˆāļē
  • āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļŦāļĢāļ·āļ­āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ
  • āļāļēāļĢāđāļāđ‰āļ›āļąāļāļŦāļē buffer overflow āđāļĨāļ° newline

6. āļāđ‰āļēāļ§āļ•āđˆāļ­āđ„āļ›āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰

āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļ­āļĒāļ­āļ”āđ„āļ›āļŠāļđāđˆāļŦāļąāļ§āļ‚āđ‰āļ­āļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āđ€āļŠāđˆāļ™:

  1. āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ: āđ€āļŠāđˆāļ™ strlen, strcmp, strcpy
  2. āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš dynamic: āđƒāļŠāđ‰ malloc āđāļĨāļ° realloc
  3. āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāđ„āļŸāļĨāđŒ: āļ­āđˆāļēāļ™/āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļ
  4. āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄ: āđ€āļŠāđˆāļ™ āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡

7. āđāļšāļšāļāļķāļāļŦāļąāļ”āđāļ™āļ°āļ™āļģ

āđ€āļžāļ·āđˆāļ­āļāļķāļāļ—āļąāļāļĐāļ°āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļŠāļēāļĄāļēāļĢāļ–āļĨāļ­āļ‡āļ—āļģ:

  1. āđāļšāļšāļāļķāļāļŦāļąāļ” 1: āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļąāļ”āļāļēāļĢāļĢāļēāļĒāļŠāļ·āđˆāļ­ â€“ āđ€āļāđ‡āļšāļŠāļ·āđˆāļ­āđāļĨāļ°āļ­āļēāļĒāļļāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”
  2. āđāļšāļšāļāļķāļāļŦāļąāļ” 2: āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āđ‰āļ™āļŦāļēāļ„āļĩāļĒāđŒāđ€āļ§āļīāļĢāđŒāļ” â€“ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ§āđˆāļēāđ€āļˆāļ­āļŦāļĢāļ·āļ­āđ„āļĄāđˆ
  3. āđāļšāļšāļāļķāļāļŦāļąāļ” 3: āļĢāļ°āļšāļšāļšāļąāļ™āļ—āļķāļ Log – āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ āļēāļĒāļŦāļĨāļąāļ‡

āļŠāļĢāļļāļ›āļŠāļļāļ”āļ—āđ‰āļēāļĒ

āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āđ„āļ”āđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļ āļēāļĐāļē C āļ•āļąāđ‰āļ‡āđāļ•āđˆāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļ‚āļąāđ‰āļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ‚āļ”āļĒāļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļŠāļģāļ„āļąāļāļ„āļ·āļ­:

  • āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ: āđƒāļŠāđ‰ fgets āļŦāļĢāļ·āļ­ getline āđāļ—āļ™ gets
  • āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ buffer āđāļĨāļ° error: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļĒāļēāļ§āđāļĨāļ°āļāļĢāļ­āļ‡āļ­āļīāļ™āļžāļļāļ•
  • āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡: āđ€āļŠāđˆāļ™ āļāļēāļĢāļĢāļąāļšāļŦāļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ”āđāļĨāļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļāļąāļšāđ„āļŸāļĨāđŒ

āļ”āđ‰āļ§āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļœāļđāđ‰āļ­āđˆāļēāļ™āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ C āļ—āļĩāđˆāļĄāļĩāļ„āļļāļ“āļ āļēāļžāđāļĨāļ°āļ›āļĨāļ­āļ”āļ āļąāļĒāđ„āļ”āđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™