سؤال

وهناك صديق لي وأظهر لي الوضع حيث أنتجت الأحرف قراءة سلوك غير متوقع. قراءة الحرف '¤' بسبب برنامجه لتحطم الطائرة. وكنت قادرا على استنتاج أن '¤' هو 164 عشري لذلك من خلال مجموعة ASCII.

لاحظنا سلوك على '¤' ولكن أي حرف> 127 يبدو لإظهار المشكلة. والسؤال هو كيف يمكننا أن قراءة موثوق مثل هذه الشخصيات شار التي كتبها شار؟

int main(int argc, const char *argv[])
{
    char input;
    do
    {
        cin >> input;
        cout << input;
        cout << " " << setbase(10) << (int)input;
        cout << " 0x" << setbase(16) << (int)input;

        cout << endl;
    } while(input);
    return 0;
}


masse@libre:temp/2009-11-30 $ ./a.out 
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
هل كانت مفيدة؟

المحلول

والنظام الخاص بك يستخدم ترميز الأحرف UTF-8 (كما يجب) وذلك الحرف '¤' يتسبب البرنامج لقراءة تسلسل بايت C2 A4. منذ char هو بايت واحد، فإنه يقرأ واحد في وقت واحد. النظر في wchar_t والمقابلة wcin وwcout تيارات لقراءة الأحرف متعددة البايت، على الرغم من أنني لا أعرف أي ترميزات التي تدعمها أو كيف تلعب مع لغات.

وبالإضافة إلى ذلك، البرنامج يتم إخراج UTF-8 صالح، لذلك كنت حقا لا ينبغي أن تكون رؤية تلك الشخصيتين - أحصل على علامات استفهام على نظام بلدي

(وهذا هو تصيد الأخطاء وofftopic إلى حد ما، ولكن ينبغي while(input) while(cin)، وإلا ستحصل حلقة لا نهائية.)

نصائح أخرى

ومن الصعب أن نقول لماذا برنامج صديقك وتحطمها دون رؤية رمز، ولكنها قد تكون لأنك تستخدم شار وذلك في مؤشر إلى صفيف. منذ أحرف خارج نطاق ASCII العادي وتجاوز حدود شار وقعت، وشار في نهاية المطاف سلبية.

وأعلن "الإدخال" كما شار غير موقعة بدلا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top