קוד: |
#include <stdio.h>
int main() { int age; ineligible: printf("You are not eligible to vote!\n"); printf("Enter you age:\n"); scanf("%d", &age); if(age<18) goto ineligible; else printf("You are eligible to vote!\n"); return 0; } |
Anonymous : |
goto היא הוראה ראויה ושימושית, רוב המשמיצים לא פגשו את הבעיות האמיתיות שלה אלא חוזרים באופן דתי על מה ששמעו. המאמר שכותרתו המקורית "A case against the goto statement" (ששונה ע"י עורך הג'ורנל לכותרת הקליק-בייט "goto considered harmful") דיבר על עולם אחר, שבו goto היא הצורה העיקרית לנהל זרימה של תוכנית, וברוב השפות, לא הייתה דרך לייצר בלוקים (ובקושי פונקציות).
בקרנל לינוקס, לדוגמא, יש כמה מאות שימושים ב- goto, ורובם מפשטים ומקצרים את הקוד משמעותית ביחס לאלטרנטיבה. ולשאלתו של הפונה: יתכן שזה בגלל buffering שעושה netbeans, איני יודע. האם אותו הדבר קורה כאשר אתה מריץ את אותה פקודה מהטרמינל? (ללא redirection כמובן, כלומר, ללא שימוש בהוראות < | > וחברותיהן) אם אתה מחפש IDE טוב ל- C, שווה לנסות את Visual Studio Code, למרות שהוא נכתב ע"י חברה עם אתיקה מפוקפקת ועבר פלילי - הוא בקוד פתוח לחלוטין, ועובד מצוין; באובונטו ניתן להתקין אותו בקלות ע"י umake. מומלץ מאוד לכבות telemetry אחרי שמתקינים אותו. |
יהודה : |
אמור היה על ההתחלה להציג "הכנס את גילך " ומשום מה לא מציג אותו . בעיה נוספת SCANF עד כמה שידוע לי קולט מחרוזת עד ENTER ורק אחרי שאני לוחץ כמה פעמים על אנטר הוא סוף סוף ממשיך בקוד . יש למישהו מושג מה יכולה להיות הבעיה ? |
קוד: |
printf("You are not eligible to vote!\n"); |
ציטוט: |
באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.
ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה. |
borsood : |
ב IDE ONLINE הקוד "עובד" במקרה.
הקוד שכתוב לא מחוייב שיציג את מה שאתה חושב שהוא צריך לעשות. שקול ללמוד את השפה ממקור אחר. |
Anonymous : | ||
מה הבעיה בקוד? לי הוא נראה דווקא בסדר. גם מתקמפל ורץ יפה ב-GCC |
קוד: |
cat <<EOF >test.c #include <stdio.h> int main() { int num, success; while(1) { printf("Number: \n"); success = scanf("%d", &num); if (!success) break; printf("I got: %d\n", num); } return 0; } EOF gcc -Wall -o test test.c |
קוד: |
$ ./test Number: 1 2 3 I got: 1 Number: I got: 2 Number: I got: 3 Number: 4 f 5 I got: 4 Number: |
קוד: |
$ stty raw; ./test; stty cooked Number: 1 I got: 1 Number: 2 I got: 2 Number: 3^MI got: 3 Number: 4 I got: 4 Number: f$ |
קוד: |
stty sane reset echo ^O # echo ctrl-v ctrl-o enter # the Enter key does not respond: try ^J: ctrl-v ctrl-j clear # or ctrl-l # ctrl-q , in case you pressed ctrl-s |
קוד: |
cat <<EOF >test.c #include <stdio.h> int main() { int num, success; while(1) { printf("Number: \n"); success = scanf("%d", &num); if (!success) break; printf("I got: %d\n", num); } return 0; } EOF gcc -Wall -o test test.c |
קוד: |
$ ./test Number: 1 2 3 I got: 1 Number: I got: 2 Number: I got: 3 Number: 4 f 5 I got: 4 Number: |
קוד: |
$ stty raw; ./test; stty cooked Number: 1 I got: 1 Number: 2 I got: 2 Number: 3^MI got: 3 Number: 4 I got: 4 Number: f$ |
קוד: |
stty sane reset echo ^O # echo ctrl-v ctrl-o enter # the Enter key does not respond: try ^J: ctrl-v ctrl-j clear # or ctrl-l # ctrl-q , in case you pressed ctrl-s |
Anonymous : |
[באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.
ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה. --לב |
borsood : | ||
לב כתב מה עיקר הבעיה בתכנית: אין טיפול נכון בbuffer של stdin או stdout.
|