يقوم ScanF بمسح تدفقات الإدخال أو السلاسل المشفرة بـ UTF8 وإنشاء بيانات الإخراج وفقًا لسلسلة تنسيق. يحاكي سلوك الوظيفة C مع نفس الاسم.
جوليا> باستخدام ScanF Julia> r ، a ، b = @scanf ("13 هذا هو رقم رئيسي" ، "٪ d ٪ [a-za-z]" ، int ، string) (2 ، 13 ، "هذا هو رقم رئيسي") 0 uint 0.0 int "" (5 ، 1 ، 0x0000000000000002 ، -inf ، 4 ، "䄙")# سلسلة تاريخ المسح الضوئي -لاحظ أن أجزاء S و MS تستخدم القيم الافتراضية> f = scanf.format "٪ d. ٪ d. ٪ 2d. ٪ 2d ٪*1 [t] ٪ 2d: ٪ 2d: ٪ 2d. ٪ 3d "؛ Julia> R ، Y ، M ، D ، H ، M ، S ، MS = Scanf ("2021.07.04T15: 53" ، F ، int ، zeros (int8 ، 5) ... ، int16) (5 ، 2021 ، 7 ، 4 ، 15 ، 53 ، 0 ، 0)
يوفر Scanf
الماكرو R ، A r, a,... = scanf(io, f::Scanf.Format, args...)
r, a,... = @scanf([io, ] "format_string", args...)
r, a,... = scanf(io, f::Scanf.Format, args...)
.
يجب أن تكون سلسلة التنسيق عبارة عن سلسلة حرفية ، والتي يتم تقييمها مرة واحدة في وقت التوسع الماكرو.
بدلاً من ذلك ، f = Scanf.format"format_string"
أو f = Scanf.Format(::AbstractString)
قم بإنشاء كائن تنسيق ، يمكن استخدامه في استدعاء الوظيفة.
الوسيطات هي القيم الافتراضية للأنواع Real
، AbstractChar
، AbstractString
، Ptr
، AbstractVector{Char}
.
قد تكون أيضًا أنواعًا فرعية ملموسة من Real
، AbstractChar
، AbstractString
، Ptr
.
تتوافق مواصفات التنسيق الرقمي مع الوسائط الرقمية String
. قد تحدث أخطاء التحويل (تعويم => int).
إذا لم يكن نوع ARG الرقمي واسعًا بما يكفي للقيمة ، فسيتم تخزين قيم الحدود مع العلامة الصحيحة (على سبيل Inf
، -0.0
).
تنسيق محددات c
و s
و [
كلها متوافقة مع الوسائط Char
و Char[]
و String
. في حالة Char
يتم أخذ الحرف الأول للسلسلة.
يتم إرجاع جميع بيانات الإخراج باعتبارها tuple بما في ذلك عدد القيم المعينة كعنصر أول. إذا كان لا يمكن تحليل القيمة ، يتم تعيين القيمة الافتراضية. في حالة عدم وجود قيمة في العنصر المقابل لـ arg
، يتم اشتقاق القيمة الافتراضية T
إذا كانت الوسيطة الافتراضية كائن Vector
، يتم تخزين قيم الإخراج بالإضافة إلى ذلك.
تتبع سلاسل التنسيق تعريف مرجع C ++-Scanf C ++ مع بعض التعديلات:
يتم دعم جميع أحرف Unicode في سلاسل التنسيق وبيانات الإدخال.
في سلاسل التنسيق ، تعد محددات المسافة البيضاء فقط أحرف مساحة ASCII في " nrtfv"
.
في بيانات الإدخال ، يتم تخطي جميع الأحرف x
مع isspace(x) == true
بواسطة أي محدد من المساحة البيضاء في سلسلة التنسيق.
لا يتم دعم %n$...
شكل مواصفات التنسيق.
يتم تجاهل المعدلات الاختيارية مثل h
، l
، L
، إلخ ؛ يتم اشتقاق نوع الهدف من الوسيطة الافتراضية المقابلة ، بدلاً من ذلك.
بالنسبة إلى النوع المحدد %c
، دون تحديد width
، يجب أن يكون للوسيطة المقابلة Char
أو String
.
بالنسبة إلى النوع المحدد %Nc
، مع حقل العرض N
، يجب أن يكون للوسيطة String
أو Vector{Char}
. يتم إعادة استخدام هذا المتجه وتغيير حجمه إلى عدد الأحرف التي تقرأها بالفعل.
يعيد النوع المحدد %n
، قيمة عدد صحيح ، وهي إزاحة الحرف في بيانات الإدخال ، التي يستهلكها هذا SCANF حتى الآن.
يتطلب النوع المحدد %p
وسيطة افتراضية Ptr
.
قيمة الإرجاع لكلتا المكالمات هي مقدار وسيط الإخراج ، تليها جميع بيانات الإخراج ، وربما القيم المتخيلات الافتراضية. على عكس C و C ++ ، يتم حساب الحجج لـ %n
.
إذا تم استنفاد دفق الإدخال قبل قراءة حرف ، يتم إرجاع eof -indicator -1
بدلاً من عدد القيم المعينة.
بالنسبة إلى مواصفات التنسيق "WhiteSpace" ، يتم استهلاك أي عدد من الأحرف (أيضًا صفر) x
مع isspace(x) == true
من دفق الإدخال.
بالنسبة إلى الحرف الحرفي المحدد للتنسيق ، تتم قراءة الحرف التالي ومقارنتها مع الحرف الحرفي. إذا كانت متساوية ، يتم استهلاكها ، وإلا فإن العملية تفشل.
إذا تتم معالجة Format Modern "حرف" %c
، فسيتم قراءة حرف واحد على الأقل وتعيينه إلى وسيطة الإخراج. إذا لم تتوفر حرف ، تفشل العملية.
إذا تتم معالجة محدد التنسيق %n
، فلا يتم استهلاك أي بيانات (ولم يتم إرجاع أي EOF) ، ولكن يتم إرجاع موضع القراءة الحالي.
كما مشتقة من مرجع C ++
تقرأ وظيفة scanf
الإدخال من الدفق الذي أشار إليه io
، تحت التحكم في format
السلسلة الذي يحدد تسلسل الإدخال المقبول وكيفية تفسيرها ، باستخدام الوسائط اللاحقة لتحديد نوع الإدخال المحول. يجب أن يتطابق عدد الوسائط مع عدد مواصفات التنسيق المطلوبة بالتنسيق.
يتكون التنسيق من توجيهات صفر أو أكثر: أحرف مساحة بيضاء واحدة أو أكثر (ASCII) ، شخصية عادية (UTF8) (لا '%'
ولا حرف أبيض (ASCII) ، أو مواصفات تحويل. يتم تقديم كل مواصفات تحويل بواسطة الحرف '%'
. بعد '%'
، يلي ما يلي في التسلسل:
شخصية اختيارية للمهمة '*'
.
عدد صحيح عشري اختياري أكبر من الصفر الذي يحدد الحد الأقصى لعرض الحقل (في الأحرف).
المعدل اختياري الطول الذي لا يستخدمه هذا التنفيذ.
حرف محدد التحويل الذي يحدد نوع التحويل المراد تطبيقه.
تنفذ وظيفة scanf
كل توجيه للتنسيق بدوره. عندما يتم تنفيذ جميع التوجيهات ، أو إذا فشل التوجيه (كما هو موضح أدناه) ، فإن الوظيفة تعود. يوصف الفشل بأنه فشل في الإدخال (بسبب حدوث خطأ ترميز أو عدم توفر أحرف الإدخال) ، أو فشل مطابقة (بسبب الإدخال غير المناسب).
يتم تنفيذ التوجيه المكون من أحرف (أحرف) مساحة البيضاء عن طريق قراءة الإدخال لأولى الشخصية غير البيضاء غير البيضاء (التي لا تزال غير مقروءة) ، أو حتى لا يمكن قراءة أي شخصيات. التوجيه لا يفشل أبدا.
يتم تنفيذ التوجيه الذي هو شخصية عادية من خلال قراءة الشخصية التالية للتيار. إذا كان هذا الحرف يختلف عن التوجيه ، فإن التوجيه يفشل وتبقى الشخصيات المختلفة واللاحقة غير مقروءة. وبالمثل ، إذا كان نهاية الملف أو خطأ ترميز أو خطأ في القراءة يمنع حرفًا من قراءته ، فإن التوجيه يفشل.
يحدد التوجيه الذي هو مواصفات التحويل مجموعة من تسلسل الإدخال المطابقة ، كما هو موضح أدناه لكل محدد. يتم تنفيذ مواصفات التحويل في الخطوات التالية:
يتم تخطي إدخال أحرف الفضاء الأبيض (كما هو محدد في وظيفة isspace
) ، ما لم تتضمن المواصفات '['
أو 'c'
أو 'n'
. لا يتم حساب هذه الشخصيات البيضاء في الفضاء مقابل عرض حقل محدد.
تتم قراءة عنصر الإدخال من الدفق ، ما لم يتضمن المواصفات محددًا 'n'
. يتم تعريف عنصر الإدخال على أنه أطول تسلسل من أحرف الإدخال والذي لا يتجاوز أي عرض حقل محدد والذي هو ، أو بادئة ، تسلسل إدخال مطابق.
الحرف الأول ، إن وجد ، بعد عنصر الإدخال يبقى غير مقروءة. إذا كان طول عنصر الإدخال صفرًا ، فإن تنفيذ التوجيه يفشل ؛ هذا الشرط هو فشل مطابق ما لم يكن نهاية الملف أو خطأ ترميز أو خطأ في القراءة منع الإدخال من الدفق ، وفي هذه الحالة يكون فشل الإدخال.
باستثناء حالة تحديد '%'
، يتم تحويل عنصر الإدخال (أو ، في حالة توجيه '%n'
، عدد أحرف الإدخال) إلى نوع مناسب إلى محدد التحويل والوسيطة المقابلة. إذا لم يكن عنصر الإدخال تسلسلًا مطابقًا ، فإن تنفيذ التوجيه يفشل: هذا الشرط هو فشل مطابق. ما لم تتم الإشارة إلى قمع المهمة بواسطة A *
، يتم دفع نتيجة التحويل إلى tuple OUPUT.
إذا كان لا يمكن تمثيل نتيجة التحويل في نوع الإخراج ، فسيتم إلقاء خطأ في التحويل.
يتم قبول المعدلات الاختيارية l
، ll
، h
، hh
، L
، j
، z
، t
قبل جميع أحرف النوع المحدد ، ولكن تم تجاهلها على خلاف ذلك.
مواصفات التحويل ومعانيها هي:
يتطابق d
مع عدد صحيح عشري موقّع اختياريًا ، ينطق تنسيقه كما هو متوقع لتسلسل الموضوع من وظيفة parse(T, _, base=10)
، حيث T
هو نوع عدد صحيح من الوسيطة.
i
أتطابق مع عدد صحيح موقّع اختياريًا ، هو نفس تنسيقه كما هو متوقع لتسلسل الموضوع لوظيفة parse(T, _, base=nothing)
.
يتطابق o
مع عدد صحيح من أوكتال موقّع اختيارياً ، هو نفسه كما هو متوقع لتسلسل موضوع وظيفة parse(T, _, base=8)
.
يتطابق u
مع عدد صحيح عشري موقّع اختياريًا ، ينطق تنسيقه كما هو متوقع لتسلسل موضوع parse(T, _, base=10)
.
يطابق x
عدد صحيح سداسي عشري موقّع اختيارياً ، وهو شكله كما هو متوقع لتسلسل موضوع parse(T, _, base=16)
.
يتطابق a
infinity
e
NaN
f
، g
تسلسل الموضوع لوظيفة parse(T, _)
، حيث T
هو نوع نقطة عائمة.
يتطابق c
إلى سلسلة من الأحرف من الرقم المحدد في عرض الحقل ( 1
إذا لم يكن عرض الحقل موجودًا في التوجيه). يجب أن يكون نوع الوسيطة String
أو Char
أو Vector{Char}
، إذا كان عرض الحقل أكبر من 1
ونوع Char
، يتم تخزين الحرف الأول فقط.
يطابق s
تسلسل (غير فارغ) من الأحرف غير البيضاء. أنواع الحجج هي كما بالنسبة c
.
[
يتطابق مع سلسلة غير فارغة من الأحرف من مجموعة من الأحرف المتوقعة (Scanset). أنواع الحجج هي كما بالنسبة c
. يتضمن محدد التحويل جميع الأحرف اللاحقة في سلسلة التنسيق ، حتى ما يصل إلى الشريحة اليمنى المطابقة ( ]
). تشكل الأحرف بين الأقواس (قائمة المسح الضوئي) Scanset ، ما لم تكن الحرف بعد الشريحة اليسرى عبارة عن محيط ( ^
) ، وفي هذه الحالة تحتوي Scanset على جميع الأحرف التي لا تظهر في قائمة المسح الضوئي بين CirceFlex و The Right Bracket. إذا بدأ محدد التحويل بـ []
أو [^]
، يكون الحرف الأيمن في قائمة المسح الضوئي والطرف التالي التالي الأيمن هو القوس الأيمن المطابق الذي ينهي المواصفات ؛ وإلا فإن حرف القوس الأيمن التالي هو الذي ينهي المواصفات. إذا كانت -
في قائمة المسح الضوئي ولم تكن الأولى ، أو الثانية التي تكون فيها الحرف الأول ^
، ولا الحرف الأخير ، فإنها تحدد النطاق بين الحرف المتبقي -
وحرف يمين -
. الترتيب الذي يحدد النطاق هو نطاق عدد صحيح من نقاط الترميز Unicode للأحرف. يتم تجاهل النطاقات الفارغة (مثل ba
).
p
يطابق مجموعة من التسلسلات ، والتي هي نفس مجموعة التسلسلات التي يمكن أن تنتجها تحويل %p
من وظيفة printf
. يجب أن تكون الوسيطة المقابلة من النوع Ptr{T}
حيث قد يكون t أي نوع. يتم تحويل عنصر الإدخال إلى قيمة المؤشر بطريقة محددة للتنفيذ. إذا كان عنصر الإدخال عبارة عن قيمة تم تحويلها في وقت مبكر أثناء تنفيذ البرنامج نفسه ، فإن المؤشر الذي ينتج عنه يقارن هذه القيمة ؛ وإلا فإن سلوك تحويل %p
غير محدد.
n
يتم استهلاك أي مدخلات. يجب أن تكون الوسيطة المقابلة نوعًا صحيحًا ، يتم تحويل عدد الأحرف القراءة من دفق الإدخال حتى الآن بواسطة هذه المكالمة إلى وظيفة scanf
. يؤدي تنفيذ توجيه %n
إلى زيادة عدد المهمة التي تم إرجاعها عند الانتهاء من تنفيذ وظيفة scanf
. إذا كانت مواصفات التحويل تتضمن شخصية مثبطة للمهمة ، فلن يتم استهلاك أي وسيطة. يتم تجاهل حقل العرض الاختياري.
%
يطابق شخصية '%'
واحدة ؛ لا يحدث أي تحويل أو مهمة. مواصفات التحويل الكاملة هي %%
. (بعبارة أخرى ، يتم التعامل مع %%
مثل %
عادي واحد).
إذا كانت مواصفات التحويل غير صالحة ، فإن السلوك غير محدد.
تعد محددات التحويل A
و E
و F
و G
و X
صالحة وتتصرف ، على التوالي ، a
و e
و f
و g
و x
يتم ترك المساحة البيضاء المتأخرة (بما في ذلك الشخصيات الجديدة) غير مقروءة ما لم تتوافق مع التوجيه. لا يمكن تحديد نجاح المباريات الحرفية والمهام المكبوتة بشكل مباشر بخلاف توجيه %n
.