- 1 1. āļāļāļāļģ
- 2 2. āļāļēāļĢāļĢāļąāļāļāđāļēāļāđāļāļāļ§āļēāļĄāđāļāļ āļēāļĐāļē C āļāļ·āļāļāļ°āđāļĢ? āļāļāļīāļāļēāļĒāđāļāļ§āļāļīāļāļāļ·āđāļāļāļēāļ
- 2.1 āļāđāļāļāļ§āļēāļĄ (String) āļāļ·āļāļāļ°āđāļĢ?
- 2.2 āļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļāļāđāļāļāļ§āļēāļĄāļāļąāļāļāļēāļĢāđāđāļĢāļĒāđ
- 2.3 āļāļąāļ§āļāļĒāđāļēāļāļāđāļāļāļ§āļēāļĄāļĨāļīāđāļāļāļĢāļąāļĨ
- 2.4 āđāļŦāļāļļāļāļĨāļāļĩāđāļāđāļāļāđāļāđāļāļēāļĢāļĢāļąāļāļāđāļēāļāđāļāļāļ§āļēāļĄ
- 3 3. āļāļąāļāļāđāļāļąāļāļāļ·āđāļāļāļēāļāđāļāļāļēāļĢāļĢāļąāļāļāđāļēāļāđāļāļāļ§āļēāļĄāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļ
- 4 4. āđāļāļāļāļīāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļĒāđāļēāļāļāļĨāļāļāļ āļąāļĒ
- 5 5. āļāļąāļāļāđāļāļąāļāļāļĩāđāđāļĄāđāđāļāļ°āļāļģāđāļŦāđāđāļāđāđāļĨāļ°āļāļēāļāđāļĨāļ·āļāļāļāļĩāđāļāļĨāļāļāļ āļąāļĒ
- 6 6. āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđï―āļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļŦāļĨāļēāļĒāļāļĢāļĢāļāļąāļāđāļĨāļ°āļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨ
- 6.1 6-1. āļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļŦāļĨāļēāļĒāļāļĢāļĢāļāļąāļ
- 6.2 6-2. āļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩāļāđāļāļāļ§āđāļēāļāļŦāļĢāļ·āļāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐ
- 6.3 6-3. āļāļēāļĢāļāļąāļāļāļēāļĢāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐāđāļĨāļ° Escape Sequence
- 6.4 6-4. āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđ: āđāļāļĢāđāļāļĢāļĄ Notepad āđāļāļāļāđāļēāļĒ
- 7 7. āļāļģāļāļēāļĄāļāļĩāđāļāļāļāđāļāļĒ (Q&A)
- 7.1 Q1: āļāļģāđāļĄāđāļĄāđāļāļ§āļĢāđāļāđāļāļąāļāļāđāļāļąāļ gets?
- 7.2 Q2: āļāļģāđāļĄ scanf āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩāļāđāļāļāļ§āđāļēāļāđāļāđ?
- 7.3 Q3: āļāđāļēāļāđāļāļāļ§āļēāļĄāļāļĩāđāļāđāļāļāļĒāļēāļ§āđāļāļīāļāļāļāļēāļ buffer āļāļāļ fgets āļāļ°āļāļģāļāļĒāđāļēāļāđāļĢ?
- 7.4 Q4: āļāļ°āļāļąāļāļāļēāļĢāļāļąāļāļŦāļē newline āļāļĩāđ fgets āđāļāđāļāļĄāļēāļāđāļ§āļĒāļāļĒāđāļēāļāđāļĢ?
- 7.5 Q5: āļāđāļē fgets āđāļŦāļĨāļ·āļāļāđāļāļĄāļđāļĨāļāļāļāđāļēāļāđāļ buffer āļāļ°āļāļģāļāļĒāđāļēāļāđāļĢ?
- 7.6 Q6: āļāđāļēāļāđāļāļāļāļēāļĢāđāļŦāđāļĢāļąāļāđāļāļāļēāļ°āļāļąāļāļĐāļĢāļŦāļĢāļ·āļāļāļąāļ§āđāļĨāļāļāļģāđāļāđāđāļŦāļĄ?
- 7.7 Q7: āļāđāļēāļāđāļāļāļ§āļēāļĄāļĒāļēāļ§āļĄāļēāļāđāļāļīāļ buffer āļāļ°āļĢāļąāļāđāļāđāļāļĒāđāļēāļāđāļĢ?
- 8 8. āļŠāļĢāļļāļ
- 8.1 1. āļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāļāļ·āđāļāļāļēāļāļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄ
- 8.2 2. āđāļĨāļ·āļāļāđāļāđāļāļąāļāļāđāļāļąāļāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļĒāđāļēāļāđāļŦāļĄāļēāļ°āļŠāļĄ
- 8.3 3. āļāļāļīāļāļąāļāļīāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāļĒāđāļēāļāļāļĨāļāļāļ āļąāļĒ
- 8.4 4. āļāļķāļāļāļąāļāļĐāļ°āļāđāļ§āļĒāļāļąāļ§āļāļĒāđāļēāļāļāļĢāļ°āļĒāļļāļāļāđ
- 8.5 5. āļāļģāļāļēāļĄāļāļĩāđāļāļāļāđāļāļĒāđāļĨāļ°āļ§āļīāļāļĩāđāļāđāđāļ
- 8.6 6. āļāđāļēāļ§āļāđāļāđāļāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđ
- 8.7 7. āđāļāļāļāļķāļāļŦāļąāļāđāļāļ°āļāļģ
- 8.8 āļŠāļĢāļļāļāļŠāļļāļāļāđāļēāļĒ
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
- āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāļāđāļāļāļ§āđāļēāļāđāļāđ:
āļāļąāļāļāđāļāļąāļscanf
āļāļ°āļāļ·āļāļ§āđāļēāļāđāļāļāļ§āđāļēāļ (space, tab, newline) āđāļāđāļāļāļąāļ§āđāļāđāļāļāđāļāļāļ§āļēāļĄ āļāļąāļāļāļąāđāļāļŦāļēāļāļāđāļāļāļ§āļēāļĄāļĄāļĩāļāđāļāļāļ§āđāļēāļ āļāļ°āļāļđāļāļāļąāļāļāļāļāļāļĨāļēāļāļāļąāļ
āļāļąāļ§āļāļĒāđāļēāļ:
āļāļīāļāļāļļāļ:
Hello World
āđāļāļēāļāđāļāļļāļ:
Hello
- āđāļŠāļĩāđāļĒāļāļāđāļ 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
- āļāđāļāļāļāļąāļ Buffer Overflow: āļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļāļāļēāļ buffer āđāļāđ
- āļĢāļāļāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩāļāđāļāļāļ§āđāļēāļ: āļŠāļēāļĄāļēāļĢāļāļĢāļąāļ space āđāļĨāļ° tab āđāļāđ
āļāđāļāļāļ§āļĢāļĢāļ°āļ§āļąāļāļāļāļ fgets
- āļāļąāļāļŦāļēāļāļķāđāļāļāļĢāļĢāļāļąāļāđāļŦāļĄāđ: āļāđāļēāļāļĩāđāļĢāļąāļāļĄāļēāļāļ°āļĄāļĩ newline āļāļĒāļđāđāļāđāļēāļĒāļāđāļāļāļ§āļēāļĄ āļāļēāļāļāļģāđāļŦāđāļĄāļĩāļāļēāļĢāļāļķāđāļāļāļĢāļĢāļāļąāļāđāļāļīāļāļĄāļē
āļ§āļīāļāļĩāļĨāļ newline:
str[strcspn(str, "\n")] = '\0';
- āļāđāļāļĄāļđāļĨāļāļāļāđāļēāļāđāļ 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
- āđāļŠāļĩāđāļĒāļāļāđāļ Buffer Overflow:
āļāļąāļāļāđāļāļąāļgets
āđāļĄāđāļĄāļĩāļāļēāļĢāļāļģāļāļąāļāļāļ§āļēāļĄāļĒāļēāļ§āļāļāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĢāļąāļāđāļāđāļēāļĄāļē āļŦāļēāļāļāđāļāļāļ§āļēāļĄāļĒāļēāļ§āđāļāļīāļ buffer āļāļ°āļāļģāđāļŦāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļđāļāđāļāļĩāļĒāļāļāļąāļāđāļĨāļ°āđāļāļīāļāļāļąāļāļŦāļēāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ
āļāļąāļ§āļāļĒāđāļēāļ:
char str[10];
gets(str); // āđāļĄāđāļĄāļĩāļāļēāļĢāļāļģāļāļąāļāļāļāļēāļāļāļīāļāļāļļāļ
āļŦāļēāļāļāđāļāļāļāđāļāļāļ§āļēāļĄ 20 āļāļąāļ§āļāļąāļāļĐāļĢ āđāļāļĢāđāļāļĢāļĄāļāļēāļāļĨāđāļĄāđāļĨāļ°āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļŠāļĩāļĒāļŦāļēāļĒ
- āļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ:
Buffer Overflow āļāļēāļāļāļđāļāđāļāļĄāļāļĩāđāļāļĒāđāļāļāļāļē (Buffer Overflow Attack) āļāļķāđāļāļāļēāļāļāļģāđāļŦāđāļĢāļ°āļāļāļāļđāļāļĒāļķāļāļāļĢāļāļ - āļāļđāļāļĒāļāđāļĨāļīāļāļāļēāļāļĄāļēāļāļĢāļāļēāļ:
āļāļąāļāļāđāļāļąāļāļāļĩāđāļāļđāļāļāļĢāļ°āļāļēāļĻāļ§āđāļē âāđāļĄāđāļāļ§āļĢāđāļāđâ āļāļąāđāļāđāļāđ 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
āļāļąāļāļāđāļāļąāļāļāļĩāđāđāļĄāđāđāļāļ°āļāļģ | āļāļąāļāļāđāļāļąāļāļāļĩāđāđāļāđāđāļāļ | āļāļĢāļ°āđāļĒāļāļāđāļŦāļĨāļąāļ |
---|---|---|
gets | fgets | āļāļĨāļāļāļ āļąāļĒ āļāļģāļŦāļāļāļāļāļēāļāļāđāļāļāļ§āļēāļĄāđāļāđ |
gets | getline | āļĢāļāļāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļĒāļēāļ§ āļāļąāļāļāļēāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļ 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;
}
āļāļļāļāļŠāļģāļāļąāļ:
- āđāļāđāļāļēāļĢāđāđāļĢāļĒāđāļŠāļāļāļĄāļīāļāļī: āđāļāđāļāļāđāļāļāļ§āļēāļĄāđāļāđāļĨāļ°āļāļĢāļĢāļāļąāļāđāļĒāļāļāļąāļ
- āđāļāđ fgets āđāļāļ·āđāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ: āļāļģāļāļąāļāļāļģāļāļ§āļāļāļąāļ§āļāļąāļāļĐāļĢ āđāļĨāļ°āļĨāļ newline
- āđāļāđ 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 āļŠāđāļ§āļāļāļĩāđāđāļāļīāļāļāļ°āđāļĄāđāļāļđāļāđāļāđāļ
āļ§āļīāļāļĩāđāļāđ:
- āđāļāđāļāđāļāļ·āļāļāļāļđāđāđāļāđāđāļĄāļ·āđāļāļāļīāļāļāļļāļāļĒāļēāļ§āđāļāļīāļ
- āđāļāđ
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 Overflowfgets
: āļāļĨāļāļāļ āļąāļĒ āļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļāļ§āļēāļĄāļĒāļēāļ§āđāļĨāļ°āļĢāļāļāļĢāļąāļāļāđāļāļāļ§āđāļēāļ āđāļāļĩāļĒāļāđāļāđāļāđāļāļāļāļąāļāļāļēāļĢ newlinegetline
: āđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļĒāļēāļ§ āđāļĨāļ°āļāļąāļāļāļēāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļąāļāđāļāļĄāļąāļāļī (āđāļāđāđāļāđāđāļāļāļēāļ°āļĢāļ°āļāļ POSIX)
3. āļāļāļīāļāļąāļāļīāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāļĒāđāļēāļāļāļĨāļāļāļ āļąāļĒ
āđāļāļ·āđāļāđāļŦāđāđāļāļĢāđāļāļĢāļĄāļĄāļĩāļāļ§āļēāļĄāđāļŠāļāļĩāļĒāļĢāđāļĨāļ°āļāļĨāļāļāļ āļąāļĒ āļāļ§āļĢāļāļāļīāļāļąāļāļīāļāļąāļāļāļĩāđ:
- āļāļąāļāļāļēāļĢāļāļāļēāļ buffer: āļāđāļāļāļāļąāļāļāđāļāļĄāļđāļĨāļĨāđāļ
- āļĨāļ newline: āļāļģāļāļ§āļēāļĄāļŠāļ°āļāļēāļāļāđāļāļĄāļđāļĨāļāļīāļāļāļļāļ
- āļāļĢāļ§āļāļŠāļāļāļāļīāļāļāļļāļ: āļāļĢāļāļāļāđāļēāļāļĩāđāđāļĄāđāļāļđāļāļāđāļāļ āđāļĨāļ°āļĢāļāļāļĢāļąāļāļāļēāļĢāļāđāļāļāđāļŦāļĄāđ
4. āļāļķāļāļāļąāļāļĐāļ°āļāđāļ§āļĒāļāļąāļ§āļāļĒāđāļēāļāļāļĢāļ°āļĒāļļāļāļāđ
āļāđāļēāļāļāļąāļ§āļāļĒāđāļēāļ āđāļāđāļ āļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļŦāļĨāļēāļĒāļāļĢāļĢāļāļąāļ āđāļĨāļ°āļāļēāļĢāļāļąāļāļāļķāļāđāļāļĨāđ āļāļģāđāļŦāđāđāļāđāļēāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļāļ§āļēāļĄāđāļāļŠāļāļēāļāļāļēāļĢāļāđāļāļĢāļīāļ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāđāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļāļąāļāļāđāļāļāļāļķāđāļ
5. āļāļģāļāļēāļĄāļāļĩāđāļāļāļāđāļāļĒāđāļĨāļ°āļ§āļīāļāļĩāđāļāđāđāļ
āđāļāļŠāđāļ§āļ Q&A āđāļāđāļāļāļīāļāļēāļĒāļāļĢāļ°āđāļāđāļāļāļĩāđāļāļąāļāļāļąāļāļāļēāđāļāļāļāđāļāļĒ āđāļāđāļ:
- āļāļąāļāļāļĢāļēāļĒāļāļēāļ
gets
āđāļĨāļ°āļāļēāļāđāļĨāļ·āļāļāļāļĩāđāļāļĨāļāļāļ āļąāļĒāļāļ§āđāļē - āļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩāļāđāļāļāļ§āđāļēāļāļŦāļĢāļ·āļāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐ
- āļāļēāļĢāđāļāđāļāļąāļāļŦāļē buffer overflow āđāļĨāļ° newline
6. āļāđāļēāļ§āļāđāļāđāļāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđ
āđāļĄāļ·āđāļāđāļāđāļēāđāļāļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāđāļĨāđāļ§ āļŠāļēāļĄāļēāļĢāļāļāđāļāļĒāļāļāđāļāļŠāļđāđāļŦāļąāļ§āļāđāļāļāļąāđāļāļŠāļđāļ āđāļāđāļ:
- āļāļąāļāļāđāļāļąāļāļāļąāļāļāļēāļĢāļāđāļāļāļ§āļēāļĄ: āđāļāđāļ
strlen
,strcmp
,strcpy
- āļāļēāļĢāļāļąāļāļāļēāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļ dynamic: āđāļāđ
malloc
āđāļĨāļ°realloc
- āļāļēāļĢāļāļģāļāļēāļāļāļąāļāđāļāļĨāđ: āļāđāļēāļ/āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļāļģāļāļ§āļāļĄāļēāļ
- āđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļāļĄāļđāļĨāđāļĨāļ°āļāļąāļĨāļāļāļĢāļīāļāļķāļĄ: āđāļāđāļ āļāđāļāļŦāļēāļāđāļāļāļ§āļēāļĄāđāļĨāļ°āļāļēāļĢāļāļąāļāđāļĢāļĩāļĒāļ
7. āđāļāļāļāļķāļāļŦāļąāļāđāļāļ°āļāļģ
āđāļāļ·āđāļāļāļķāļāļāļąāļāļĐāļ°āđāļāļīāđāļĄāđāļāļīāļĄ āļŠāļēāļĄāļēāļĢāļāļĨāļāļāļāļģ:
- āđāļāļāļāļķāļāļŦāļąāļ 1: āļŠāļĢāđāļēāļāļĢāļ°āļāļāļāļąāļāļāļēāļĢāļĢāļēāļĒāļāļ·āđāļ â āđāļāđāļāļāļ·āđāļāđāļĨāļ°āļāļēāļĒāļļāļŦāļĨāļēāļĒāļāļĢāļĢāļāļąāļ
- āđāļāļāļāļķāļāļŦāļąāļ 2: āđāļāļĢāđāļāļĢāļĄāļāđāļāļŦāļēāļāļĩāļĒāđāđāļ§āļīāļĢāđāļ â āļāļĢāļ§āļāļŠāļāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļđāđāđāļāđāļāđāļāļāļ§āđāļēāđāļāļāļŦāļĢāļ·āļāđāļĄāđ
- āđāļāļāļāļķāļāļŦāļąāļ 3: āļĢāļ°āļāļāļāļąāļāļāļķāļ Log â āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļĨāļāđāļāļĨāđāđāļāļ·āđāļāđāļĢāļĩāļĒāļāđāļāđāļ āļēāļĒāļŦāļĨāļąāļ
āļŠāļĢāļļāļāļŠāļļāļāļāđāļēāļĒ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāđāļāļĢāļāļāļāļĨāļļāļĄāļāļēāļĢāļĢāļąāļāļāđāļāļāļ§āļēāļĄāđāļāļ āļēāļĐāļē C āļāļąāđāļāđāļāđāļāļ·āđāļāļāļēāļāļāļāļāļķāļāļāļąāđāļāļāļĢāļ°āļĒāļļāļāļāđ āđāļāļĒāļāļĢāļ°āđāļāđāļāļŠāļģāļāļąāļāļāļ·āļ:
- āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ: āđāļāđ
fgets
āļŦāļĢāļ·āļgetline
āđāļāļgets
- āļāļēāļĢāļāļąāļāļāļēāļĢ buffer āđāļĨāļ° error: āļāļĢāļ§āļāļŠāļāļāļāļ§āļēāļĄāļĒāļēāļ§āđāļĨāļ°āļāļĢāļāļāļāļīāļāļāļļāļ
- āļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļāļēāļāļāļĢāļīāļ: āđāļāđāļ āļāļēāļĢāļĢāļąāļāļŦāļĨāļēāļĒāļāļĢāļĢāļāļąāļāđāļĨāļ°āļāļēāļĢāļāļģāļāļēāļāļāļąāļāđāļāļĨāđ
āļāđāļ§āļĒāļāļ·āđāļāļāļēāļāđāļŦāļĨāđāļēāļāļĩāđ āļāļđāđāļāđāļēāļāļāļ°āļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄ C āļāļĩāđāļĄāļĩāļāļļāļāļ āļēāļāđāļĨāļ°āļāļĨāļāļāļ āļąāļĒāđāļāđāļĄāļēāļāļāļķāđāļ