שיחה:שפת C/מחרוזות

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
קפיצה לניווט קפיצה לחיפוש

הסכנה בgets[עריכה]

gets היא פונקציה מסוכנת ואין מקום ללמד אותה למשתמשים חדשים ב- C.‏ gcc למשל יתן אזהרה אם תשתמשו ב- gets. אני מציע למחוק את ההסבר על gets ולהחליפו באזהרה לא להשתמש בה. --אפסאלון 23:35, 16 פברואר 2006 (UTC)

גם כרגע יש אזהרה, אבל אני מסכים שהיא לא תקיפה מספיק. אתה מוזמן לשכתב. גדי אלכסנדרוביץ' 05:43, 17 פברואר 2006 (UTC)
ה-man שבאתר hmug‏[1] אומר ש:

SECURITY CONSIDERATIONS

The gets() function cannot be used securely. Because of its lack of
bounds checking, and the inability for the calling program to reliably
determine the length of the next incoming line, the use of this function
enables malicious users to arbitrarily change a running program's func-
tionality through a buffer overflow attack. It is strongly suggested
that the fgets() function be used in all cases. (See the FSA.)

יש כאלה[2] שמוותרים על ההסתמכות על המחשבה של המתכנת, ועל התקווה שהוא יטרח לפעול לפי המלצות, ולכן מציינים בפשטות:

BUGS

Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.

It is not advisable to mix calls to input functions from the stdio library with low-level calls to read() for the file descriptor associated with the input stream; the results will be undefined and very probably not what you want.

או בקיצור: Never use gets()‎. אז אולי כדאי לחשוב שוב על שימוש בפונקציה שדי אסור להשתמש בה במדריך ראשוני למתכנת מתחיל בשפה?... ‏conio.h‏ • ‏שיחה‏ 03:03, 18 יולי 2006 (IDT)
נו, די, אתה משכנע את המשוכנעים. כתוב אזהרה ברורה בתוך הערך עצמו. גדי אלכסנדרוביץ' 16:55, 19 יולי 2006 (IDT)
אני לא מנסה לשכנע. אני פשוט חושב שבמקום לתת אזהרה בולטת יותר, או אזהרה בולטת מאוד, או אזהרה סופר-בולטת כדאי פשוט לטרוח ולהשתמש ישר ב-fgets ה"מסובכת". זה ידרוש יותר הסברים בהתחלה, אבל יחסוך צרות בטווח הארוך. אולי אפשר לכתוב משהו בסגנון "תאמינו לנו שזו טעות, ולא משנה למה, ואתם חייבים לציין את גודל הזיכרון שאליו מותר לכתוב" עם הפניה להסבר נוסף (בלי לסבך את הקורא כבר כאן) על גלישת חוצץ (לדוגמה: גלישת חוצץ). ‏conio.h‏ • ‏שיחה‏ 17:55, 23 יולי 2006 (IDT)
אפשר להציג ישר את fgets, אני בעד, אבל עדיין צריך להציג את gets ולהסביר "זה רע!". אם לא מציגים משהו והקורא נתקל בו במקור אחר, הוא יחשוב שני דברים: "למה הם סיבכו אותי עם ה-fgets המסורבלת הזו? ולמה אני בכלל קורא את המדריך הטיפשי שלהם אם פקודות בסיסיות כאלו הם לא מכירים?". עדיף להראות משהו למישהו ולהסביר לו למה הוא רע, מאשר להימנע כליל מלדבר עליו. זו גישתי. גדי אלכסנדרוביץ' 07:52, 24 יולי 2006 (IDT)
בהחלט לגיטימי. :) אני פשוט מתכוון שקודם נגיד מה כן, ורק בשלב מעט מאוחר יותר מה לא, כי כדי להסביר "למה לא", צריך להסביר ש-gets עוצרת רק כשמסתיימת מחרוזת הקלט, וזו יכולה להיות גדולה מהזיכרון שהוקצה למחרוזת; וזה יכול לגרום לדריסה של זיכרון שלא שייך למשתנה הזה, וזה יכול לגרום לצרות. ועוד צריך להסביר אלו צרות. ולמרות שזה נראה הדבר הכי פשוט בעולם, זה ממש לא טריויאלי לאדם שנתקל בזה בפעם הראשונה ("אבל אמרתי לו לכתוב רק לתוך המשתנה הזה!"). קודם נותנים לקורא הרגשה טובה עם המדריך, ורק אז מתחילים להפחיד אותו. :) ‏conio.h‏ • ‏שיחה‏ 18:29, 24 יולי 2006 (IDT)
יש לי מדריך ל-C++ (מן הסתם גם ל-C) שכתוב בו שבפונקציה gets(str)


str[0] זה מס' התווים המקסימלי שניתן לקרוא (ככה "חושבת" הפונקציה)
ו-str[1] זה מס' התווים שנקרא בפועל (אחרי הקריאה)
שאר התווים אלה המחרוזת עצמה
80.178.120.186 10:57, 21 באוגוסט 2006 (IDT)

בטח ספרייה לא סטנדרטית. אין ל-gets דרך לדעת מה גודל הבאפר שהיא מקבלת. אסור להשתמש בה, לדעתי, אין כל סיבה לכתוב עליה אלא בהערת שולים. צריך להשתמש ב-fgets גם אם זה ל-stdin. דרורק 01:35, 24 בנובמבר 2006 (IST)
מה שם המדריך הזה ומי כתב אותו? שנדע מה לא לקרוא. גדי אלכסנדרוביץ' 15:53, 28 בנובמבר 2006 (IST)
דיברתי בטעות על הפונקציה cgets
--87.69.223.105 16:12, 7 בדצמבר 2006 (IST)

לא נראה לי מדוייק להגדיר את string.h כספריה נדרשת[עריכה]

יש ספריות שבלתי אפשרי בלעדיהן, כמו stdio.h. הספרייה הזאת כוללת בעיקר פונקציות נוחות שחבל להגדיר מחדש כל פעם.

Thedsadude 20:50, 23 בנובמבר 2007 (IST)

השמת ערכים למחרוזת - לא מדוייק[עריכה]

הכותרת מדברת על השמת ערכים למחרוזת, אולם רוב הקטע מדבר על אתחול מחרוזת. קצת מבלבל, לדעתי. אני מחליף את הכותרת. Thedsadude 00:17, 24 בנובמבר 2007 (IST)

חוסר אחידות בתרגילים[עריכה]

חלק מהתרגילים כאן משתמשים בקבועים (לדוגמה, 10) כדי לציין גדלים של מערכים, וחלק משתמשים בpreprocessor. מעבר לחוסר האחידות, #define עדיין לא הוצג בנקודה זו, ולכן נראה לי שאין להשתמש בו כאן. אני מתכוון לשנות זאת.Thedsadude 08:00, 24 בנובמבר 2007 (IST)

איך זה מופיע לפני פונקציות?[עריכה]

פתאום שמתי לב שהפרק הבא הוא פונקציות, אבל בפרק זה כבר מדברים על strlen, strcpy, וכו'. האם כדאי להחליף את הסדר?Thedsadude 17:29, 24 בנובמבר 2007 (IST)

העברת buffer overrun לשפת C/מערכים[עריכה]

הסכנות בגלישה במחרוזות נובעות מכך שמחרוזות הן מערכים. אני מעביר לכן את רוב החומר בכך למערכים. Thedsadude 09:50, 27 בנובמבר 2007 (IST)

העפת gets וputs[עריכה]

נראה לי סתם מבלבל לכתוב באריכות על שתי פונקציות רק כדי לומר שאין להשתמש בהן. אלטרנטיבות:

  • fscanf עם קובע רוחב
  • fgets תוך ציון שמשמעות stdin תובהר בפרק על IO קבצים

ובכלל, אין שום צורך (ורצוי להימנע) מלדחוף כמה שיותר פונקציות מהספריה הסטנדרטית. Thedsadude 09:40, 9 בינואר 2008 (IST)

אי סדר בפסקאות הקלט והפלט[עריכה]

בתור אחד שמנסה ללמוד C מאפס בעזרת הספר, אני מתקשה להסתדר עם הבךאגן של החלק הזה, עקב סילוק הפסקאות אודות puts ו-gets. כמדומני, הפונקציות fscanf ו-fgets מופיעות לראשונה בספר זה בפלט וקלט קבצים, שאליו עוד לא הגענו בשלב זה של הספר, ולכן ללא מידע חיצוני נוסף, יווצר באופן ודאי בילבול רב. אותו בילבול שנוצר בפסקאות אלו בשל הערבוביה של הפונקציות בטקסט, מקשה על הלמידה באופן קשה. אני מתכוון לשנות זאת. השף בודהה - שיחה 01:11, 18 בפברואר 2012 (IST)

אהלן, קודם כל תודה רבה! הספר מועיל לי מאוד![עריכה]

יש נקודה מסוימת שלי הייתה חסרה, פוינטרים לפוינטרים, ועוד חומר יותר ממשי לגבי הקצאות דינמיות כמו העיסוק בהקצאות ע"י פונקציות, איך אני מקבל כתובת מפונקציה וכאלה, דברים שלי אישית היו פחות ברורים...

מוזמן להוסיף בהמשך ‏Illuyanka‏ 17:43, 6 בפברואר 2016 (IST)