[Powered by Google Translate] [טיעוני שורת פקודה]
[כריסטופר רתולומיאו - אוניברסיטת הרווארד]
[זה CS50 - CS50.TV]
תכונה שימושית לתכנית היא לקבל קלט ממשתמש.
עד כה, יש לנו חקרנו כמה פונקציות בתוך CS50 הספרייה
כדי לקבל קלט משתמש, כגון "לקבל מחרוזת"
המנחה את המשתמש, תוך היישום פועל, למחרוזת.
>> עם זאת, יש מקרים שבם ברצונך לספק קלט התכנית שלך
לפני זה באמת פועל.
בדרך זו, אתה לא צריך לבקש מידע נוסף מהמשתמש שלך
בעת ביצוע משימה פשוטה.
קח, למשל, או פקודת mv מהלך ביוניקס.
פקודה זו מאפשרת למשתמש להעביר קבצים ממקום אחד למשנו.
על פי הדפים הידניים, MV מקבל שני ארגומנטים של שורת פקודה:
הקובץ שמועבר ואת מיקום הקובץ מועבר ל.
אז דוגמה זו יש פקודה בשני טיעונים.
אז איך אנחנו אומרים לי תכנית C לנצל טיעוני שורת הפקודה האלה?
>> ובכן, מתברר שראשי, בו אנו משתמשים בכל תוכניות C, יש סוד.
עיקרי מקבלת שני פרמטרים: argc וargv.
בואו נעבור על תנאים אלה.
>> הפרמטר הראשון, argc, העומד לטענת רוזן,
יש סוג נתונים של מספר שלם.
פרמטר argc מכיל את מספר הטיעונים, לרבות הפיקוד.
בפקודת המהלך שלנו, למרות שנשארנו לנו רק שני טיעונים המוצגים,
הערך של argc יהיה 3.
הפרמטר השני, argv, העומד לטענת וקטור,
הוא מערך של מצביעי char המצביעים על מייתרים.
>> משמעות הדבר הוא שכל רכיב בargv, מתחיל מאפס,
מכיל את הפקודה וטיעונים.
לדוגמה, argv [0], שבו אני מתייחס אליו כargv אפס,
תמיד מכיל את הפקודה שמתנהלת -
במקרה זה, MV.
argv [1] יכיל את הטענה הראשונה, file.txt,
וargv [2] יכיל את הטיעון השני, ~ / cs50 /.
הטיעון האחרון של argv תמיד יהיה ריק.
אז בואו ליישם טיעונים אלה שורת פקודה.
בתרגילים הקודמים, אנו מניחים את הריק, ללא משמעות, כפרמטר של ראשי.
עם זאת, על מנת שאוכל להשתמש בטיעונים של שורת פקודה,
אנחנו צריכים להסיר בתוך חלל ומקום של int argc הראשי, char * argv [].
עכשיו, כדי לגשת לכל האלמנט מargv, שהם הטיעונים שלך,
אתה פשוט יכול לחזר, או לולאה, באמצעות מערך כזה.
אז, בתוך גופו של ראשי, אנחנו הולכים קדימה והקלידו ללולאה:
עבור (אני int = 0; i <argc; אני + +).
>> אנחנו לא צריכים סד מתולתל כאן כי אנחנו רק ביצוע שורה אחת של קוד
בתוך הגוף של הלולאה הזו.
נלך קדימה ופגענו בכרטיסייה אחת,
לאחר מכן הקלד printf ("argv [% d], כדי לייצג את ערך שלם,
הוא% s, לחוט, ואז תו השורה החדשה.
אז אנחנו מספקים printf i לצורתה הנוכחית של הלולאה
וargv [i] לייצוג המחרוזת של הטיעון הנוכחי של שורת פקודה.
כאשר אנו מפעילים את זה עם שני טיעונים, אנחנו נראה את הטיעונים שמוצגים בטרמינל.
מוקדם יותר אמר שargv התקיים מערך של מצביעי char.
>> לכן, אם זה מקרה, איך אנחנו לאחר מכן לגשת תווים בודדים בכל ויכוח?
לדוגמה, מה אם אני רוצה לחפש תו מסוים בטענה הראשונה?
ובכן, התשובה היא שאנחנו צריכים ליישם לולאה מקוננת
כי אז יהיה לחזר דרך כל אחד מהמרכיבים במחרוזת הוויכוח.
זה איך אתה עושה את זה.
>> ראשית, אנחנו הולכים ליצור עותק של example2.c.
ואז, בתוך הראשון ללולאה,
אנחנו הולכים להוסיף נוספים ללולאה.
אז עבור (int j = 0, n = strlen (argv [i]),
אז מה נותן לנו את אורכו של הוויכוח הנוכחי,
, J <n; j + +)
אנחנו הולכים להדפיס את המיקום של כל תו
בתוך הוויכוח הנוכחי באמצעות printf.
אז, printf ("argv [% d], כדי לייצג את האינדקס של הוויכוח הנוכחי,
אז [% d] שוב, כדי לייצג את האופי הנוכחי של הוויכוח הנוכחי,
הוא: ג%, על דמותה הנוכחית בוויכוח.
לבסוף, אנו מספקים printf עם המדד של הלולאה החיצונית, אני,
אז המדד של הלולאה הפנימית.
>> והטיעון האחרון שלנו לprintf הוא דמות הממשית מהוויכוח ספק
בשורת הפקודה.
עכשיו, בגלל שהשתמשתי בפונקצית מחרוזת strlen לקבל האורך של מחרוזת,
עליי גם להוסיף ספריית string.h לראש כולל שלנו.
לכן, כדי לעשות את זה, תלך, ורק תחת stdio.h, אנחנו הולכים לעשות
# כולל .
>> אז, בואו לקמפל ולהריץ ולספק אותו טיעון ממשי.
>> וכמו שאנחנו יכולים לראות, עכשיו יש לנו את המיקום המדויק של כל תו הבודד בויכוח.
אז זהו זה. אני כריסטופר רתולומיאו, זה CS50.
[CS50.TV]