อาร์กิวเมนต์ทางเลือกและชื่อ
อาร์กิวเมนต์ทางเลือก
C# 4.0 แนะนำคุณสมบัติใหม่ที่ปรับปรุงความสะดวกในการระบุอาร์กิวเมนต์เมื่อเรียกใช้เมธอด เครื่องมือนี้เรียกว่า อาร์กิวเมนต์ทางเลือกและอนุญาตให้คุณกำหนดค่าเริ่มต้นสำหรับพารามิเตอร์เมธอด ค่านี้จะถูกใช้เป็นค่าเริ่มต้นหากไม่มีการระบุอาร์กิวเมนต์ที่เกี่ยวข้องสำหรับพารามิเตอร์เมื่อเรียกใช้เมธอด ดังนั้นจึงไม่จำเป็นต้องระบุอาร์กิวเมนต์สำหรับพารามิเตอร์ดังกล่าว อาร์กิวเมนต์ทางเลือกช่วยให้เรียกเมธอดได้ง่ายขึ้น โดยอาร์กิวเมนต์เริ่มต้นจะถูกนำไปใช้กับพารามิเตอร์บางตัว นอกจากนี้ยังสามารถใช้เป็นรูปแบบ "สั้น" ของวิธีการโอเวอร์โหลด
แรงผลักดันหลักสำหรับการเพิ่มอาร์กิวเมนต์ทางเลือกคือความจำเป็นในการทำให้การโต้ตอบกับวัตถุ COM ง่ายขึ้น ในรูปแบบวัตถุของ Microsoft หลายรุ่น (ตัวอย่างเช่น ไมโครซอฟต์ออฟฟิศ) มีฟังก์ชันการทำงานผ่านออบเจกต์ COM ซึ่งหลายรายการเขียนขึ้นเมื่อนานมาแล้วและได้รับการออกแบบให้ใช้พารามิเตอร์ทางเลือก
ตัวอย่างของการใช้อาร์กิวเมนต์ทางเลือกแสดงอยู่ด้านล่าง:
ใช้ระบบ; ใช้ System.Collections.Generic; ใช้ System.Linq; ใช้ System.Text; เนมสเปซ ConsoleApplication1 ( โปรแกรมคลาส ( // อาร์กิวเมนต์ b และ c เป็นทางเลือกเมื่อเรียกสแตติก int mySum(int a, int b = 5, int c = 10) ( คืนค่า a + b + c; ) โมฆะคงที่ Main() ( int sum1 = mySum(3); int sum2 = mySum(3,12); Console.WriteLine("Sum1 = "+sum1); Console.WriteLine("Sum2 = "+sum2); Console.ReadLine(); ) ) )
โปรดทราบว่าอาร์กิวเมนต์ทางเลือกทั้งหมดจำเป็นต้องระบุทางด้านขวาของอาร์กิวเมนต์ที่จำเป็น นอกเหนือจากเมธอดแล้ว อาร์กิวเมนต์ทางเลือกสามารถใช้ในตัวสร้าง ตัวสร้างดัชนี และผู้รับมอบสิทธิ์
ข้อดีอย่างหนึ่งของอาร์กิวเมนต์ทางเลือกคือทำให้โปรแกรมเมอร์สามารถจัดการกับเมธอดที่ซับซ้อนและการเรียกคอนสตรัคเตอร์ได้ง่ายขึ้น ท้ายที่สุด บ่อยครั้งจำเป็นต้องตั้งค่าพารามิเตอร์ในเมธอดมากกว่าที่จำเป็น และในกรณีเช่นนี้ พารามิเตอร์เหล่านี้บางส่วนสามารถกำหนดให้เป็นทางเลือกได้โดยใช้อาร์กิวเมนต์ทางเลือกอย่างระมัดระวัง ซึ่งหมายความว่าคุณจะต้องผ่านการโต้แย้งที่สำคัญในที่กำหนด กรณีเฉพาะไม่ใช่อาร์กิวเมนต์ทั้งหมด ซึ่งควรเป็นอย่างอื่น วิธีการนี้ช่วยให้เราสามารถหาเหตุผลเข้าข้างตนเองของวิธีการและทำให้โปรแกรมเมอร์จัดการกับมันได้ง่ายขึ้น
อาร์กิวเมนต์ที่มีชื่อ
อีกหนึ่ง ฟังก์ชันการทำงานซึ่งถูกเพิ่มเข้ามาใน C# ด้วยการเปิดตัว .NET 4.0 ซึ่งรองรับสิ่งที่เรียกว่า ชื่ออาร์กิวเมนต์. อย่างที่คุณทราบ เมื่อส่งอาร์กิวเมนต์ไปยังเมธอด ลำดับที่อาร์กิวเมนต์นั้นปรากฏตามกฎ จะต้องตรงกับลำดับที่กำหนดพารามิเตอร์ในเมธอดเอง กล่าวอีกนัยหนึ่ง ค่าอาร์กิวเมนต์ถูกกำหนดให้กับพารามิเตอร์ตามตำแหน่งในรายการอาร์กิวเมนต์
อาร์กิวเมนต์ที่มีชื่อออกแบบมาเพื่อเอาชนะข้อจำกัดนี้ อาร์กิวเมนต์ที่มีชื่อช่วยให้คุณสามารถระบุชื่อของพารามิเตอร์ที่กำหนดค่าให้ และในกรณีนี้ ลำดับของการโต้แย้งจะไม่มีความสำคัญอีกต่อไป ดังนั้น อาร์กิวเมนต์ที่มีชื่อจะค่อนข้างคล้ายกับตัวเริ่มต้นของวัตถุที่กล่าวถึงก่อนหน้านี้ แม้ว่าจะแตกต่างจากพวกเขาในไวยากรณ์ก็ตาม หากต้องการระบุอาร์กิวเมนต์ตามชื่อ ให้ใช้รูปแบบไวยากรณ์ต่อไปนี้:
Parameter_name: ค่า
ที่นี่ Parameter_nameหมายถึงชื่อของพารามิเตอร์ที่ส่งผ่านค่า แน่นอนว่า Parameter_name ต้องเป็นชื่อของพารามิเตอร์ที่ถูกต้องสำหรับเมธอดที่เรียกใช้
มันเกิดขึ้นเมื่อข้อมูลถูกถ่ายโอนไปยังโปรแกรมจากบรรทัดคำสั่งเมื่อมีการเรียกใช้ ข้อมูลดังกล่าวเรียกว่าอาร์กิวเมนต์บรรทัดคำสั่ง ดูเหมือนว่านี้ ตัวอย่างเช่น:
./a.out test.txt ls -lt /home/peter/
สิ่งนี้เรียกโปรแกรม a.out (จากไดเร็กทอรีปัจจุบัน) และ ls (จากไดเร็กทอรีเดียวกันที่ระบุในตัวแปรสภาพแวดล้อม PATH) โปรแกรมแรกจากบรรทัดคำสั่งได้รับหนึ่งคำ - test.txt โปรแกรมที่สอง - สอง: -lt และ /home/peter/
หากโปรแกรมเขียนด้วยภาษา C เมื่อโปรแกรมเริ่มทำงาน การควบคุมจะถูกถ่ายโอนไปยังฟังก์ชัน main() ทันที ดังนั้นเธอจึงเป็นผู้ที่ได้รับอาร์กิวเมนต์บรรทัดคำสั่งที่กำหนดให้กับพารามิเตอร์ตัวแปรของเธอ
จนถึงตอนนี้ เราได้กำหนดฟังก์ชัน main() ราวกับว่ามันไม่ใช้พารามิเตอร์ใดๆ และไม่ส่งคืนสิ่งใดๆ อันที่จริง ใน C ฟังก์ชันใดๆ ตามค่าเริ่มต้น (หากไม่มีการกำหนดเป็นอย่างอื่น) จะคืนค่าเป็นจำนวนเต็ม สิ่งนี้สามารถตรวจสอบได้ หากคุณเขียนโค้ดดังนี้:
main() ( printf("สวัสดี \n") ; กลับ 0 ; )
จากนั้นจะไม่มีการเตือนหรือข้อผิดพลาดเกิดขึ้นระหว่างการคอมไพล์ เช่นเดียวกันจะเกิดขึ้นถ้าเราเขียน int main() นี่เป็นการพิสูจน์ว่าฟังก์ชันเริ่มต้นส่งคืนจำนวนเต็มไม่ใช่ค่าใด (โมฆะ) แม้ว่าสิ่งที่ฟังก์ชันส่งคืนสามารถ "แทนที่" ได้เสมอ ตัวอย่างเช่น voidmain() หรือ float main()
เมื่อโปรแกรมถูกเรียกจากบรรทัดคำสั่ง ข้อมูลคู่หนึ่งจะถูกส่งผ่านไปยังโปรแกรมนั้นเสมอ:
- จำนวนเต็มแสดงจำนวนคำ (องค์ประกอบที่คั่นด้วยช่องว่าง) ในบรรทัดคำสั่งเมื่อเรียก
- ตัวชี้ไปยังอาร์เรย์ของสตริงโดยที่แต่ละบรรทัดคือคำเดียวจากบรรทัดคำสั่ง
โปรดทราบว่าชื่อโปรแกรมนั้นได้รับการพิจารณาด้วย ตัวอย่างเช่น หากการโทรมีลักษณะดังนี้:
./a.out 12 ธีม 2
จากนั้นอาร์กิวเมนต์แรกของโปรแกรมคือ 4 และอาร์เรย์ของสตริงถูกกำหนดเป็น ("./a.out", "12", "theme", "2")
ให้ความสนใจกับคำศัพท์ มีเพียงสองอาร์กิวเมนต์ของโปรแกรม (ตัวเลขและอาร์เรย์) แต่มีอาร์กิวเมนต์บรรทัดคำสั่งมากเท่าที่คุณต้องการ อาร์กิวเมนต์บรรทัดคำสั่ง "แปล" เป็นอาร์กิวเมนต์ของโปรแกรม (เป็นอาร์กิวเมนต์ของฟังก์ชัน main())
ข้อมูลนี้ (ตัวเลขและตัวชี้) จะถูกส่งผ่านไปยังโปรแกรมแม้ว่าจะเรียกง่ายๆ ด้วยชื่อโดยไม่ได้ส่งผ่านข้อมูลใดๆ ไปยังโปรแกรม: ./a.out ในกรณีนี้ อาร์กิวเมนต์แรกคือ 1 และอาร์กิวเมนต์ที่สองชี้ไปที่อาร์เรย์ที่มีสตริงเดียว (""./a.out")
ความจริงที่ว่าข้อมูลถูกส่งไปยังโปรแกรมไม่ได้หมายความว่าฟังก์ชัน main() ควรได้รับข้อมูลนั้น หากฟังก์ชัน main() ถูกกำหนดโดยไม่มีพารามิเตอร์ จะไม่สามารถเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งได้ แม้ว่าจะไม่มีอะไรขัดขวางไม่ให้คุณส่ง จะไม่มีข้อผิดพลาดเกิดขึ้น
ในการเข้าถึงข้อมูลที่ส่งผ่านไปยังโปรแกรม จะต้องกำหนดให้กับตัวแปร เนื่องจากอาร์กิวเมนต์จะถูกส่งต่อไปยัง main() ทันที ส่วนหัวควรมีลักษณะดังนี้:
หลัก (int n, ถ่าน * arr)
ตัวแปรตัวแรก (n) มีจำนวนคำ และตัวแปรตัวที่สองมีตัวชี้ไปยังอาร์เรย์ของสตริง บ่อยครั้งที่พารามิเตอร์ตัวที่สองเขียนเป็น **arr อย่างไรก็ตาม มันก็เหมือนกัน จำได้ว่าอาร์เรย์ของสตริงนั้นมีตัวชี้ไปยังสตริงเป็นองค์ประกอบ และในฟังก์ชัน เราจะส่งตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์ ปรากฎว่าเรากำลังส่งตัวชี้ไปยังตัวชี้เช่น **อาร์
ออกกำลังกาย
เขียนโปรแกรมดังนี้
#รวม
มันพิมพ์จำนวนคำบนบรรทัดคำสั่งเมื่อมีการเรียกใช้ และแต่ละคำด้วย บรรทัดใหม่. เรียกว่าไม่มีอาร์กิวเมนต์บรรทัดคำสั่งและมีข้อโต้แย้ง
ในโปรแกรม เราใช้ตัวแปรพารามิเตอร์ argc และ argv เป็นเรื่องปกติที่จะใช้ชื่อดังกล่าว แต่ในความเป็นจริงพวกเขาสามารถเป็นอะไรก็ได้ เป็นการดีกว่าที่จะปฏิบัติตามมาตรฐานนี้เพื่อให้โปรแกรมของคุณเข้าใจได้มากขึ้น ไม่เพียงสำหรับคุณเท่านั้น แต่ยังรวมถึงโปรแกรมเมอร์คนอื่นๆ ด้วย
ความสำคัญในทางปฏิบัติของการส่งข้อมูลไปยังโปรแกรม
หากคุณมีประสบการณ์เกี่ยวกับบรรทัดคำสั่ง GNU/Linux คุณจะรู้ว่าคำสั่งส่วนใหญ่มีสวิตช์และอาร์กิวเมนต์ ตัวอย่างเช่น เมื่อดูเนื้อหาของไดเร็กทอรี การคัดลอก การย้าย วัตถุจะถูกระบุเป็นอาร์กิวเมนต์ ระบบไฟล์ที่ดำเนินการคำสั่ง คุณสมบัติของการใช้งานถูกกำหนดโดยใช้ปุ่ม เช่น ในคำสั่ง
Cp -r ../les_1 ../les_101
cp คือชื่อของคำสั่ง -r คือสวิตช์ และ ../les_1 และ ../les_101 คืออาร์กิวเมนต์ของคำสั่ง
โดยทั่วไป บ่อยครั้งเมื่อเปิดโปรแกรม ที่อยู่ไฟล์และ "ตัวดัดแปลง" (ซึ่งเป็นคีย์) ของกระบวนการดำเนินการโปรแกรมจะถูกถ่ายโอน
มาเขียนโปรแกรมที่เปิดไฟล์ที่ระบุโดยผู้ใช้ในบรรทัดคำสั่งเพื่อเขียนหรือต่อท้ายและเขียน (เพิ่ม) ข้อมูลเดียวกันกับที่ผู้ใช้ป้อนจากแป้นพิมพ์ระหว่างการทำงานของโปรแกรม:
#รวม
คำอธิบายสำหรับรหัส:
- มีการสร้างอาร์เรย์ของตัวชี้ไฟล์ห้าตัว ดังนั้นจึงไม่สามารถเปิดไฟล์พร้อมกันได้ไม่เกินห้าไฟล์ ตัวชี้ไฟล์ของไฟล์แรกจะถูกจัดเก็บไว้ในองค์ประกอบอาร์เรย์ f ตัวชี้ที่สองใน f และอื่น ๆ
- มีการตรวจสอบจำนวนอาร์กิวเมนต์บรรทัดคำสั่ง ต้องมีอย่างน้อยสามคนเพราะ อันแรกคือชื่อของโปรแกรม อันที่สองคือโหมดเปิดไฟล์ อันที่สามคือไฟล์แรกหรือไฟล์เดียวที่จะเขียน เนื่องจากโปรแกรมอนุญาตให้คุณเปิดไฟล์ได้เพียงห้าไฟล์ จำนวนอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดจึงไม่เกินเจ็ดไฟล์ ดังนั้นหากจำนวนอาร์กิวเมนต์น้อยกว่า 3 หรือมากกว่า 7 โปรแกรมจะสิ้นสุดลงเนื่องจาก คำสั่ง return ทำให้ฟังก์ชันออกจากการทำงาน แม้ว่าจะมีโค้ดเพิ่มเติมตามมาก็ตาม ค่าส่งคืนฟังก์ชันที่ไม่เท่ากับ 0 สามารถตีความได้โดยกระบวนการพาเรนต์ว่าเป็นข้อความที่โปรแกรมหยุดทำงานโดยมีข้อผิดพลาด
- มีการตรวจสอบความถูกต้องของอาร์กิวเมนต์บรรทัดคำสั่งที่สอง ถ้ามันไม่ใช่ "-w" หรือ "-a" นิพจน์เงื่อนไขใน if ที่สองจะส่งกลับ 1 (จริง) ฟังก์ชัน strcmp() ช่วยให้คุณเปรียบเทียบสตริงและส่งกลับ 0 หากสตริงเท่ากัน
- ใน สำหรับลูปไฟล์ถูกเปิดตามที่อยู่ที่ระบุซึ่งเริ่มต้นด้วยองค์ประกอบที่สามของอาร์เรย์ argv นั่นคือสาเหตุที่เพิ่ม 2 ให้กับ i เพื่อรับองค์ประกอบของอาร์เรย์ argv โดยเริ่มจากองค์ประกอบที่สาม นิพจน์ argc-2 ระบุจำนวนชื่อไฟล์ที่ส่งผ่าน เพราะ argc เก็บจำนวนอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมด โดยสองรายการแรกไม่ใช่ชื่อไฟล์
- นิพจน์ argv+1 อนุญาตให้คุณ "ตัด" สตริงย่อย "w" (หรือ "a") จากสตริง "-w" (หรือ "-a") เนื่องจาก argv เป็นตัวชี้ไปยังองค์ประกอบแรกของสตริง โดยการเพิ่มตัวชี้ เราจะเลื่อนไปยังองค์ประกอบถัดไปในอาร์เรย์
- หากไม่สามารถเปิดไฟล์ได้ ฟังก์ชัน fopen() จะคืนค่า NULL ในกรณีนี้โปรแกรมจะสิ้นสุดลง
- อักขระแต่ละตัวที่ป้อนโดยผู้ใช้จากแป้นพิมพ์จะถูกเขียนลงในไฟล์ที่เปิดอยู่ทั้งหมด
- ในตอนท้ายไฟล์จะถูกปิด
เมื่อสร้างคอนโซลแอปพลิเคชันโดยอัตโนมัติในภาษาโปรแกรม C++ ฟังก์ชันหลักจะถูกสร้างขึ้นโดยอัตโนมัติซึ่งคล้ายกับฟังก์ชันนี้มาก:
int main(int argc, ถ่าน * argv)
{…}
ส่วนหัวของฟังก์ชันประกอบด้วยลายเซ็น ฟังก์ชั่นหลัก main() พร้อมอาร์กิวเมนต์ argc และ argv
หากโปรแกรมทำงานผ่านบรรทัดคำสั่ง จะสามารถถ่ายโอนข้อมูลใดๆ ไปยังโปรแกรมนี้ได้ มีอาร์กิวเมนต์บรรทัดคำสั่ง argc และ argv สำหรับสิ่งนี้
พารามิเตอร์ argc เป็นประเภท int และมีจำนวนพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชันหลัก นอกจากนี้ argc จะมีค่าอย่างน้อย 1 เสมอแม้ว่าจะไม่มีการส่งข้อมูลไปยังฟังก์ชันหลักก็ตาม เนื่องจากชื่อของแอปพลิเคชันถือเป็นพารามิเตอร์แรก
พารามิเตอร์ argv เป็นอาร์เรย์ของตัวชี้ไปยังสตริง เฉพาะข้อมูลประเภทสตริงเท่านั้นที่สามารถส่งผ่านบรรทัดคำสั่งได้
เมื่อเริ่มโปรแกรมผ่านคำสั่ง วินโดวส์ไลน์คุณสามารถส่งข้อมูลบางอย่างไปให้ ในกรณีนี้ บรรทัดคำสั่งจะมีลักษณะดังนี้:
ไดรฟ์:\path\name.exe argument1 argument2 ...
อาร์กิวเมนต์บรรทัดคำสั่งคั่นด้วยช่องว่างตั้งแต่หนึ่งช่องขึ้นไป
อาร์กิวเมนต์ argv มีชื่อแอปพลิเคชันแบบเต็ม:
#รวม
ใช้เนมสเปซ std;
ศาล<< argv << endl;
กลับ 0;
}
ผลการดำเนินการ
ตัวอย่าง : การคำนวณผลคูณของจำนวนเต็มสองจำนวน
โปรแกรมใช้สตริงเป็นฟังก์ชันการแปลงจำนวนเต็ม StrToInt() จากที่นี่
#รวม
ใช้เนมสเปซ std;
int StrToInt(ถ่าน*s) (...)
int หลัก (int argc, ถ่าน * argv) (
Int a = 0, b=0;
ถ้า (argc > 1)
a = StrToInt(argv);
ถ้า (argc > 2)
b = StrToInt(argv);
ศาล<< a <<«*» << b << «= « << a*b << endl;
กลับ 0;
}
โปรแกรมเปิดตัวเป็น
ผลการดำเนินการ
การดีบักโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่ง
ในการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งเมื่อทำการดีบักโปรแกรม คุณต้องเข้าถึงเมนู คุณสมบัติโครงการ.
บนแท็บ คุณสมบัติการกำหนดค่า -> ดีบักเลือก อาร์กิวเมนต์คำสั่งและตั้งค่าของพวกเขา
เมื่อคุณรันโปรแกรมในโหมดดีบัก อาร์กิวเมนต์ที่ป้อนจะถูกปฏิบัติโดยโปรแกรมเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
บางครั้งเมื่อเริ่มต้นโปรแกรม การส่งข้อมูลบางอย่างไปยังโปรแกรมจะเป็นประโยชน์ โดยทั่วไป ข้อมูลนี้จะถูกส่งผ่านไปยังฟังก์ชัน main() ผ่านทางอาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์บรรทัดคำสั่งเป็นข้อมูลที่ป้อนบนบรรทัดคำสั่งของระบบปฏิบัติการตามชื่อโปรแกรม ตัวอย่างเช่น ในการเริ่มคอมไพล์โปรแกรม คุณต้องพิมพ์ข้อความต่อไปนี้ในบรรทัดคำสั่งหลังข้อความแจ้ง:
ซีซี โปรแกรม_ชื่อ
โปรแกรม_ชื่อเป็นอาร์กิวเมนต์บรรทัดคำสั่งที่ระบุชื่อโปรแกรมที่คุณกำลังจะคอมไพล์
ในการยอมรับอาร์กิวเมนต์บรรทัดคำสั่ง จะใช้อาร์กิวเมนต์ในตัวพิเศษสองตัว: argc และ argv พารามิเตอร์ argc มีจำนวนอาร์กิวเมนต์บนบรรทัดคำสั่งและเป็นจำนวนเต็ม และมีอย่างน้อย 1 เสมอ เนื่องจากอาร์กิวเมนต์แรกคือชื่อของโปรแกรม และพารามิเตอร์ argv เป็นตัวชี้ไปยังอาร์เรย์ของตัวชี้ไปยังสตริง ในอาร์เรย์นี้ แต่ละองค์ประกอบจะชี้ไปที่อาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดเป็นสตริง ดังนั้นการแปลงตัวเลขใด ๆ ให้เป็นรูปแบบไบนารีที่ต้องการจะต้องมีอยู่ในโปรแกรมเมื่อมีการพัฒนา
นี่คือตัวอย่างง่ายๆ ของการใช้อาร์กิวเมนต์บรรทัดคำสั่ง หน้าจอจะแสดงคำว่า Hello และชื่อของคุณ ซึ่งจะต้องระบุเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
#รวม
หากคุณตั้งชื่อโปรแกรมนี้ (ชื่อ) และชื่อของคุณคือ Tom หากต้องการรันโปรแกรม ให้ป้อนชื่อ Tom ที่บรรทัดคำสั่ง จากการรันโปรแกรม ข้อความ Hello, Tom จะปรากฏขึ้นบนหน้าจอ
ในหลายสภาพแวดล้อม อาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดต้องแยกออกจากกันด้วยช่องว่างหรือแท็บ เครื่องหมายจุลภาค เครื่องหมายอัฒภาค และอักขระที่คล้ายกันไม่ถือเป็นตัวคั่น ตัวอย่างเช่น,
เรียกใช้สปอตเรียกใช้
ประกอบด้วยสตริงอักขระสามตัว ในขณะที่
เอริค, ริค, เฟร็ด
เป็นสตริงอักขระเดียว - โดยทั่วไปแล้วเครื่องหมายจุลภาคจะไม่ถือเป็นตัวคั่น
หากสตริงมีช่องว่าง ในบางสภาพแวดล้อม สตริงสามารถใส่เครื่องหมายอัญประกาศคู่เพื่อป้องกันไม่ให้สร้างอาร์กิวเมนต์หลายรายการได้ ดังนั้น สตริงทั้งหมดจะถูกพิจารณาเป็นหนึ่งอาร์กิวเมนต์ หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการตั้งค่าตัวเลือกบรรทัดคำสั่งบนระบบปฏิบัติการของคุณ โปรดดูเอกสารประกอบของระบบนั้น
การประกาศ argv อย่างถูกต้องเป็นสิ่งสำคัญมาก นี่คือวิธีที่พวกเขาทำบ่อยที่สุด:
ถ่าน *argv;
วงเล็บเหลี่ยมว่างแสดงว่าอาร์เรย์มีความยาวไม่จำกัด ขณะนี้คุณสามารถเข้าถึงแต่ละอาร์กิวเมนต์ได้โดยการจัดทำดัชนีอาร์เรย์ argv ตัวอย่างเช่น argv ชี้ไปที่สตริงอักขระตัวแรก ซึ่งเป็นชื่อโปรแกรมเสมอ argv ชี้ไปที่อาร์กิวเมนต์แรก และอื่นๆ
อีกตัวอย่างเล็กๆ ของการใช้อาร์กิวเมนต์บรรทัดคำสั่งคือโปรแกรมนับถอยหลังด้านล่าง โปรแกรมนี้นับถอยหลังจากค่าบางค่า (ระบุไว้ในบรรทัดคำสั่ง) และส่งเสียงบี๊บเมื่อถึง 0 โปรดทราบว่าอาร์กิวเมนต์แรกที่มีค่าเริ่มต้นจะถูกแปลงเป็นค่าจำนวนเต็มโดยใช้ฟังก์ชันมาตรฐาน atoi () หากอาร์กิวเมนต์ที่สองของบรรทัดคำสั่ง (และถ้าเราใช้ชื่อโปรแกรมเป็นอาร์กิวเมนต์ที่สาม) เป็นสตริง "แสดงผล" (ส่งออกไปยังหน้าจอ) ผลลัพธ์ของการนับถอยหลัง (ในลำดับย้อนกลับ) จะปรากฏขึ้น บนหน้าจอ.
/* โปรแกรมนับถอยหลัง */ #รวม
โปรดทราบว่าหากไม่ได้ระบุอาร์กิวเมนต์บรรทัดคำสั่ง ข้อความแสดงข้อผิดพลาดจะแสดงขึ้น โปรแกรมที่มีอาร์กิวเมนต์บรรทัดคำสั่งมักจะทำสิ่งต่อไปนี้: เมื่อผู้ใช้รันโปรแกรมเหล่านี้โดยไม่ป้อนข้อมูลที่จำเป็น คำแนะนำจะแสดงวิธีระบุอาร์กิวเมนต์อย่างถูกต้อง
หากต้องการเข้าถึงอักขระตัวเดียวในอาร์กิวเมนต์บรรทัดคำสั่ง ให้ป้อนดัชนีตัวที่สองลงใน argv ตัวอย่างเช่น โปรแกรมต่อไปนี้พิมพ์อาร์กิวเมนต์ทั้งหมดที่ถูกเรียกใช้แบบอักขระต่ออักขระ:
#รวม โปรดจำไว้ว่าดัชนีแรกของ argv ให้การเข้าถึงสตริง และดัชนีที่สองให้การเข้าถึงอักขระแต่ละตัว โดยปกติแล้ว argc และ argv จะใช้เพื่อส่งคำสั่งเริ่มต้นไปยังโปรแกรมที่จำเป็นเมื่อเริ่มทำงาน ตัวอย่างเช่น อาร์กิวเมนต์บรรทัดคำสั่งมักจะระบุข้อมูล เช่น ชื่อไฟล์ ตัวเลือก หรือลักษณะการทำงานอื่น การใช้อาร์กิวเมนต์บรรทัดคำสั่งทำให้โปรแกรมของคุณ "ดูเป็นมืออาชีพ" และทำให้ใช้งานในแบตช์ไฟล์ได้ง่ายขึ้น ชื่อ argc และ argv เป็นชื่อดั้งเดิมแต่ไม่จำเป็น คุณสามารถตั้งชื่อพารามิเตอร์ทั้งสองนี้ในฟังก์ชัน main() ได้ตามต้องการ นอกจากนี้ คอมไพเลอร์บางตัวอาจสนับสนุน - ข้อโต้แย้งเพิ่มเติมสำหรับ main() ดังนั้น โปรดตรวจสอบเอกสารประกอบสำหรับคอมไพเลอร์ของคุณ เมื่อโปรแกรมไม่ต้องการพารามิเตอร์บรรทัดคำสั่ง เป็นเรื่องธรรมดาที่สุดที่จะประกาศฟังก์ชัน main() อย่างชัดเจนว่าไม่มีพารามิเตอร์ ในกรณีนี้ จะใช้คีย์เวิร์ด void ในรายการพารามิเตอร์ของฟังก์ชันนี้ Borland C++ รองรับสามอาร์กิวเมนต์ main() สองอันแรกคือ argc และ argv แบบดั้งเดิม นี่เป็นอาร์กิวเมนต์เดียวของฟังก์ชัน main() ที่กำหนดโดยมาตรฐาน ANSI C พวกเขาอนุญาตให้ส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรม อาร์กิวเมนต์บรรทัดคำสั่งคือข้อมูลที่ตามหลังชื่อโปรแกรมบนบรรทัดคำสั่งของระบบปฏิบัติการ ตัวอย่างเช่น เมื่อโปรแกรมถูกคอมไพล์ด้วยคอมไพเลอร์แบบอินไลน์ของ Borland โดยทั่วไปแล้ว bcc จะถูกพิมพ์ โปรแกรม_ชื่อ ที่ไหน โปรแกรม_ชื่อเป็นโปรแกรมที่จะคอมไพล์ ชื่อโปรแกรมจะถูกส่งผ่านไปยังคอมไพเลอร์เป็นอาร์กิวเมนต์ พารามิเตอร์ argc มีจำนวนอาร์กิวเมนต์บรรทัดคำสั่งและเป็นจำนวนเต็ม เป็นอย่างน้อย 1 เสมอ เนื่องจากชื่อโปรแกรมมีคุณสมบัติเป็นอาร์กิวเมนต์แรก พารามิเตอร์ argv เป็นตัวชี้ไปยังอาร์เรย์ของตัวชี้อักขระ แต่ละองค์ประกอบของอาร์เรย์นี้ชี้ไปที่อาร์กิวเมนต์บรรทัดคำสั่ง อาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดเป็นสตริง โปรแกรมแปลงตัวเลขทั้งหมดเป็นรูปแบบภายใน โปรแกรมต่อไปนี้จะพิมพ์ "Hello" ตามด้วยชื่อผู้ใช้ หากพิมพ์ต่อจากชื่อโปรแกรม: #รวม หากคุณเรียกชื่อโปรแกรมนี้ และชื่อผู้ใช้คือ Sergey ดังนั้นในการรันโปรแกรม คุณควรพิมพ์: อาร์กิวเมนต์บรรทัดคำสั่งต้องคั่นด้วยช่องว่างหรือแท็บ เครื่องหมายจุลภาค เครื่องหมายอัฒภาค และอักขระที่คล้ายกันไม่ถือเป็นตัวคั่น ตัวอย่างเช่น: ประกอบด้วยสามบรรทัดในขณะที่ เฮิร์บ,ริค,เฟร็ด นี่คือหนึ่งบรรทัด - เครื่องหมายจุลภาคไม่ใช่ตัวคั่น หากคุณต้องการส่งสตริงที่มีช่องว่างหรือแท็บเป็นอาร์กิวเมนต์เดียว ให้ใส่เครื่องหมายคำพูดคู่ ตัวอย่างเช่น นี่เป็นอาร์กิวเมนต์หนึ่ง: "นี่คือการทดสอบ" สิ่งสำคัญคือต้องประกาศ argv ให้ถูกต้อง วิธีทั่วไปที่สุดคือ: วงเล็บว่างระบุว่าอาร์เรย์ไม่มีความยาวคงที่ คุณสามารถเข้าถึงแต่ละองค์ประกอบโดยใช้การจัดทำดัชนี argv ตัวอย่างเช่น argv ชี้ไปที่บรรทัดแรกซึ่งมีชื่อโปรแกรมเสมอ argv ชี้ไปที่บรรทัดถัดไป และอื่นๆ ด้านล่างนี้คือตัวอย่างเล็กๆ ของการใช้อาร์กิวเมนต์บรรทัดคำสั่ง โดยจะนับถอยหลังจากค่าที่ระบุในบรรทัดคำสั่งและส่งสัญญาณเมื่อถึงศูนย์ โปรดทราบว่าอาร์กิวเมนต์แรกประกอบด้วยตัวเลขที่แปลงเป็นจำนวนเต็มโดยใช้ฟังก์ชันมาตรฐาน atoi() หากสตริง "display" แสดงเป็นอาร์กิวเมนต์ที่สอง ตัวนับจะแสดงบนหน้าจอ /* โปรแกรมนับ */ #รวม โปรดทราบว่าหากไม่มีการระบุอาร์กิวเมนต์ ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น นี่เป็นเรื่องปกติที่สุดของโปรแกรมที่ใช้อาร์กิวเมนต์บรรทัดคำสั่งเพื่อออกคำสั่งหากมีการพยายามเรียกใช้โปรแกรมโดยไม่มีข้อมูลที่ถูกต้อง ในการเข้าถึงอักขระบรรทัดคำสั่งแต่ละตัว ให้เพิ่มดัชนีที่สองใน argv ตัวอย่างเช่น โปรแกรมต่อไปนี้จะพิมพ์อาร์กิวเมนต์ทั้งหมดที่ถูกเรียกด้วยอักขระทีละตัว: #รวม ต้องจำไว้ว่าดัชนีแรกมีไว้สำหรับเข้าถึงสตริง และดัชนีที่สองมีไว้สำหรับเข้าถึงอักขระของสตริง โดยทั่วไปจะใช้ argc และ argv เพื่อรับคำสั่งซอร์ส ในทางทฤษฎี คุณสามารถมีอาร์กิวเมนต์ได้มากถึง 32,767 อาร์กิวเมนต์ แต่ระบบปฏิบัติการส่วนใหญ่ไม่อนุญาตให้คุณเข้าใกล้อาร์กิวเมนต์นั้นด้วยซ้ำ โดยทั่วไป อาร์กิวเมนต์เหล่านี้ใช้เพื่อระบุชื่อไฟล์หรือตัวเลือก การใช้อาร์กิวเมนต์บรรทัดคำสั่งทำให้โปรแกรมดูเป็นมืออาชีพและอนุญาตให้ใช้โปรแกรมในแบตช์ไฟล์ หากคุณรวมไฟล์ WILDARGS.OBJ ที่มาพร้อมกับ Borland C++ คุณสามารถใช้สัญลักษณ์แทนในอาร์กิวเมนต์ประเภท *.EXE (Borland C++ จัดการรูปแบบโดยอัตโนมัติและเพิ่ม argc ตามนั้น) ตัวอย่างเช่น หากคุณเชื่อมต่อ WILDARGS.OBJ กับโปรแกรมต่อไปนี้ โปรแกรมจะพิมพ์จำนวนไฟล์ที่ตรงกับชื่อไฟล์ที่ระบุในบรรทัดคำสั่ง: /* เชื่อมโยงโปรแกรมนี้กับ WILDARGS.OBJ */ #รวม หากเราเรียกโปรแกรมนี้ว่า WA ให้รันดังนี้ เราจะได้จำนวนไฟล์ที่มีนามสกุล EXE และรายชื่อไฟล์เหล่านี้: นอกจาก argc และ argv แล้ว Borland C++ ยังมีอาร์กิวเมนต์บรรทัดคำสั่งที่สาม -env พารามิเตอร์ env อนุญาตให้โปรแกรมเข้าถึงข้อมูลเกี่ยวกับสภาพแวดล้อมของระบบปฏิบัติการ พารามิเตอร์ env ต้องตามหลัง argc และ argv และประกาศดังนี้: อย่างที่คุณเห็น env ถูกประกาศในลักษณะเดียวกับ argv เช่นเดียวกับ argv นี่คือตัวชี้ไปยังอาร์เรย์ของสตริง แต่ละบรรทัดเป็นสตริงสภาพแวดล้อมที่กำหนดโดยระบบปฏิบัติการ พารามิเตอร์ env ไม่มีคู่ขนานกับพารามิเตอร์ argc ซึ่งจะบอกจำนวนบรรทัดของสภาพแวดล้อมที่มีอยู่ บรรทัดสุดท้ายของสภาพแวดล้อมจะเป็นโมฆะแทน โปรแกรมต่อไปนี้พิมพ์สตริงสภาพแวดล้อมทั้งหมดที่กำหนดไว้ในระบบปฏิบัติการในปัจจุบัน: /* โปรแกรมนี้พิมพ์บรรทัดสภาพแวดล้อมทั้งหมด */ #รวม โปรดทราบว่าแม้ว่าโปรแกรมจะไม่ใช้ argc และ argv แต่จะต้องมีอยู่ในรายการพารามิเตอร์ C ไม่ทราบชื่อพารามิเตอร์ การใช้งานจะถูกกำหนดตามลำดับการประกาศพารามิเตอร์แทน อันที่จริง คุณสามารถเรียกพารามิเตอร์อะไรก็ได้ที่คุณต้องการ เนื่องจาก argc, argv และ env เป็นชื่อดั้งเดิม ควรใช้ต่อไปเพื่อให้ทุกคนที่อ่านโปรแกรมสามารถรับรู้ได้ทันทีว่าสิ่งเหล่านี้เป็นอาร์กิวเมนต์ของฟังก์ชัน main() สำหรับโปรแกรม งานทั่วไปคือการค้นหาค่าที่กำหนดในสตริงสภาพแวดล้อม ตัวอย่างเช่น เนื้อหาของสตริง PATH อนุญาตให้โปรแกรมใช้เส้นทางการค้นหา โปรแกรมต่อไปนี้สาธิตวิธีค้นหาสตริงที่ประกาศเส้นทางการค้นหามาตรฐาน ใช้ฟังก์ชันไลบรารีมาตรฐาน strstr() ซึ่งมีต้นแบบดังต่อไปนี้: ถ่าน *strstr(const ถ่าน *str1, const ถ่าน *str2); ฟังก์ชัน strstr() ค้นหาสตริงที่ชี้โดย str1 ในสตริงที่ชี้โดย str2 หากพบสตริงดังกล่าว ตัวชี้ไปยังตำแหน่งแรกจะถูกส่งกลับ หากไม่พบรายการที่ตรงกัน ฟังก์ชันจะคืนค่า NULL /* โปรแกรมค้นหาสตริงสภาพแวดล้อมเพื่อหาสตริงที่มี PATH */ #รวม
{
ถ้า(argc!=2)
{
printf("คุณลืมพิมพ์ชื่อ\n");
กลับ 1;
}
printf("สวัสดี %s", argv);
กลับ 0;
}
ชื่อเซอร์เกย์
ผลลัพธ์ของโปรแกรมจะปรากฏขึ้น:
สวัสดีเซอร์เกย์
#รวม
#รวม
int หลัก (int argc, ถ่าน * argv)
{
int disp, นับ;
ถ้า (argc<2)
{
printf("คุณต้องป้อนความยาวของจำนวน\n");
printf("ในบรรทัดคำสั่ง ลองใหม่อีกครั้ง\n");
กลับ 1;
}
ถ้า (argc==3 && !srcmp(argv,"display")) disp = 1;
อื่น disp = 0;
สำหรับ (นับ = atoi (argv); นับ; - นับ)
ถ้า (แสดง) printf("%d", นับ);
printf("%c", "\a"); /* ในคอมพิวเตอร์ส่วนใหญ่จะเป็นการโทร */
กลับ 0;
}
int หลัก (int argc, ถ่าน * argv)
{
int t, ฉัน;
สำหรับ (t=0; t
ฉัน = 0;
ในขณะที่(argv[t][i])
{
printf("%c", argv[t][i]);
}
พิมพ์f(");
}
กลับ 0;
}
int หลัก (int argc, ถ่าน * argv)
{
ลงทะเบียน int ฉัน;
printf("%d ไฟล์ตรงกับชื่อที่ระบุ\n", argc-1);
printf("พวกเขาคือ:");
สำหรับ (i=1; i
กลับ 0;
}
int main(int argc, ถ่าน *argv, ถ่าน *env)
{
int เสื้อ;
สำหรับ (t=0; env[t]/ t++)
printf("%s\n", env[t]);
กลับ 0;
}
#รวม
int main (int argc, ถ่าน *argv, ถ่าน *env)
{
int เสื้อ;
สำหรับ (t=0; env[t]; t++)
{
ถ้า (strstr (env [t], "เส้นทาง"))
printf("%s\n", env[t]);
}
กลับ 0;
}