GammaCyber

כתיבת קוד — שיעור 34

Strings ב-C

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T2 · בסיסי200 נק'~15 דק'build
העתקת מחרוזת בטוחה ב-C
ממש safe_copy(dst, src, size) שמעתיק לכל היותר size-1 תווים ותמיד מסיים ב-'\0' (בניגוד ל-strcpy המסוכן). בתוכנית: קראו מילה, העתיקו בבטחה ל-buf בגודל 8, והדפיסו את התוצאה. קלט ארוך ייחתך בבטחה.
דוגמאות
SuperSecret → SuperSe (7 תווים, buf=8)
abc → abc
פתרון-ייחוס העתקת מחרוזת בטוחה ב-C ›
#include <stdio.h> #include <string.h> void safe_copy(char *dst, const char *src, size_t size){ if(size==0) return; size_t i=0; for(; i<size-1 && src[i]; i++) dst[i]=src[i]; // לכל היותר size-1 תווים dst[i]='\0'; // תמיד מסיים ב-NUL } int main(){ char in[256], out[8]; if(scanf("%255s",in)!=1) return 1; safe_copy(out,in,sizeof(out)); printf("%s\n",out); return 0; }
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~20 דק'algorithmic
סורק פונקציות C מסוכנות
ממש find_unsafe(lines) המחזיר (מספר_שורה, שם_פונקציה) לכל שימוש בפונקציית C מסוכנת: gets, strcpy, strcat, sprintf. זהה קריאת-פונקציה ממש (שם ואז '(') — אל תסמן זהות חלקית כמו my_gets_wrapper. מספור מ-1.
דוגמאות
find_unsafe(['gets(buf);']) → [(1, 'gets')]
find_unsafe(['x=1','strcpy(a,b);']) → [(2, 'strcpy')]
פתרון-ייחוס סורק פונקציות C מסוכנות ›
import re def find_unsafe(lines): danger = ('gets', 'strcpy', 'strcat', 'sprintf') pat = re.compile(r'\b(' + '|'.join(danger) + r')\s*\(') # קריאת-פונקציה ממש out = [] for i, ln in enumerate(lines, 1): m = pat.search(ln) if m: out.append((i, m.group(1))) return out
הפתרון נשמר מקומית אוטומטית.