تهيئة مصفوفة char مع ثابت ثماني

0

رأيت تعليقًا يقول أن التهيئة لصفيف char مع "\001" سيضع رقمًا كحرف أول. لقد رأيت أين \0 لا يضع نول.

التعليق غير المعدل:

char input[SIZE] = ""; is sufficient initialization. while ( '\001' == input[0]) doesn't do what you think it is doing if you have initialized input[SIZE] = "\001"; (which creates an empty-string with the nul-character as the 1st character.)

هذا البرنامج

#include <stdio.h>
#define SIZE 8
int main ( void) {
    char input[SIZE] = "\001";

    if ( '\001' == input[0]) {//also tried 1 == input[0]
        printf ( "octal 1\n\n");
    }
    else {
        printf ( "empty string\n");
    }
    return 0;
}

يعمل على لينكس ، مع ترجمة gcc النواتج

octal 1

لذا فإن الحرف الأول هو 1 عوضا عن '\0' .
هل هذا هو السلوك القياسي أو مجرد شيء مع لينكس و gcc ؟؟؟ لماذا لا تضع نول؟

3 الاجابة

3
افضل جواب

Is this the standard behavior or just something with Linux and gcc? Why does it not set a nul?

سلوك الكود الذي تقدمه مطلوب حسب المعيار. في كل من حرفية السلسلة وثوابت الأحرف الصحيحة ، قد تحتوي الهروب الثماني على رقم واحد أو رقمين أو ثلاثة أرقام ، ويحدد المعيار C ما يلي:

Each octal [...] escape sequence is the longest sequence of characters that can constitute the escape sequence.

( C2011 ، 6.4.4.4/7 )

في هذا السياق من المهم أن \0 هو تسلسل هروب ثماني ، وليس رمزًا خاصًا ومستقلًا للحرف الفارغ. إن السياق الأوسع للاقتباس أعلاه سيوضح ذلك.

في السلسلة الحرفية "\001" ، يتبع الخط المائل العكسي ثلاثة أرقام ثمانية ، ويمكن أن يحتوي الهروب الثماني على ثلاثة أرقام ، وبالتالي يتكون تسلسل الهروب من الخط المائل العكسي وجميع الأرقام الثلاثة. الحرف الأول من السلسلة الناتجة هو الحرف ذو القيمة الصحيحة 1.

إذا أردت لسبب ما سلسلة حرفية تتكون من حرف فارغ متبوعًا بالأرقام العشرية 0 و 1 ، فيمكنك إما التعبير عن القيمة الفارغة بهروب كامل من ثلاثة أرقام ،

"\00001"

أو تقسيمها على هذا النحو:

"\0" "01"

سينضم C إلى حرفية السلسلة المجاورة لإخراج النتيجة المطلوبة.

:مؤلف
3
افضل جواب

I saw a comment that said initialization of a char array with "\001" would put a nul as the first character.

كان هذا التعليق عن طريق الخطأ.

من 6.4.4.1 الثوابت الصحيحة ، الفقرة 3 ، منجم التركيز:

An octal constant consists of the prefix 0 optionally followed by a sequence of the digits 0 through 7 only.

لكن ما ننظر إليه هنا ليس ثابتًا صحيحًا على الإطلاق . ما لدينا هنا ، في الواقع ، هو تسلسل هروب ثماني . ويتم تعريف ذلك على النحو التالي (في 6.4.4.4 ثوابت الأحرف ):

octal-escape-sequence:
        \ octal-digit
        \ octal-digit octal-digit
        \ octal-digit octal-digit octal-digit

التعريف - لكل من الثوابت الصحيحة وكذلك الثوابت الشخصية - هو "الجشع" ، كما هو موضح في الفقرة 7:

Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

هذا يعني أنه إذا كان أول رقم ثماني متبوعًا بشيء يمكن أن يكون رقمًا ثمانيًا ، فإن الحرف التالي يعتبر رقمًا ثمانيًا ينتمي إلى هذا الثابت (بحد أقصى ثلاثة في حالة ثوابت الأحرف - ليس كذلك بالنسبة للثوابت الصحيحة) !).

وبالتالي الخاص بك "\001" هو في الواقع شخصية ذات قيمة 1.

لاحظ أنه على الرغم من أن ثوابت الأحرف الثمانية تعمل حتى ثلاثة أحرف كحد أقصى (مما يجعل هذا الثابت آمنًا تمامًا للاستخدام إذا كانت مبطنة بالأصفار البادئة عند الضرورة للحصول على طول ثلاثة أرقام) ، فإن ثوابت الأحرف السداسية العشرية تعمل طالما هناك أرقام سداسية عشرية ( يحتمل أن تفيض char اكتب المقصود به تهيئة).

:مؤلف
2
افضل جواب

راجع http://c0x.coding-guidelines.com/6.4.4.4.html

يتم تعريف التسلسل الثماني على النحو التالي:

  octal-escape-sequence:
            \ octal-digit
            \ octal-digit octal-digit
            \ octal-digit octal-digit octal-digit

والبند 873:

The octal digits that follow the backslash in an octal escape sequence are taken to be part of the construction of a single character for an integer character constant or of a single wide character for a wide character constant.

أيضا البند 877:

Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

لذلك السلوك هو الصحيح. يجب ألا تحتوي "\ 001" على بايت بايت في الموضع 0.

:مؤلف
فوق
قائمة طعام