اسم متاجر مجموعة تم استرجاعها من GetVolumeInformation غريب في Visual C ++؟

StackOverflow https://stackoverflow.com/questions/3251079

سؤال

أود استخدام مكالمة GetVolumeInformation لاسترداد اسم الجهاز القابل للإزالة.يمكنني استرداد الاسم غرامة فقط وتخزينها في متغير tchar صفيف szvolnameBuff.هنا هو رمزي لذلك:

giveacodicetagpre.

عندما أحاول طباعة محتويات المتغير مع السطر:

giveacodicetagpre.

أحصل على إخراج "T" بدلا من الاسم "تجاوز" وهو اسم محرك الأقراص.قمت بتصحيحها باستخدام Visual Studio 2008 ووجدت أن Thar Arrade يخزن الاسم باسم: [0] [1] 0 [2] 'ص' [3] 0 [4 ا' [5] 0 [6] 'ن' [7] 0

وهلم جرا وهكذا دواليك.لماذا هذا؟أريد الصفيف لتخزين الكلمة فقط:

[0] 'T' [1] 'ص' [2] [3] 'ن' [4] 's'

لاستخدامها لاحقا للحصول على سلسلة سلسلة.هل هناك طريقة لإصلاح هذا؟

هل كانت مفيدة؟

المحلول

يبدو أنك تستخدم APIs Unicode Win32.يجب استخدام _tprintf بحيث يتم استخدام الوظيفة المناسبة (PrintF أو WPRINTF) وفقا لنوع الأحرف.

إذا كنت لا تعرف Unicode - إليك نظرة عامة سريعة.السبب يحدث هذا هو أن UNICODE لشخصيات ASCII العادية هي بايت Null تليها حرف ASCII.لهذا السبب أنت ترى السلسلة مبطن مع Nulls.

لاحظ أنه عند استخدام Tchar، يجب عليك أيضا التفاف جميع الأوتار في الماكرو _t ()، بحيث يتم الإعلان عنها أيضا من النوع الصحيح.إذا اتبعت هذا باستمرار، فإن التحويل من Unicode إلى ANSI هو مسألة تغيير توجيه مسبق.

نصائح أخرى

السبب هو أنك تستخدم إصدارات Unicode من Apis Win32.

وهناك 2 إصلاحات.الأول هو استخدام الإصدارات القياسية من API والتي إذا كنت تستخدم Visual Studio يمكن القيام به عن طريق تغيير مجموعة أحرف المشروع الخاص بك إلى "غير تعيين" في المشاريع -> خصائص -> خصائص التكوين -> General-> مجموعة الأحرف، أوعن طريق التأكد من أن Unicode غير محدد قبل إدراج Windows.H إذا كنت لا تستخدم vs.

الإصلاح الثاني، كما قال MDMA، هو استخدام وظيفة معالجة نص Unicode Wprintf أو استخدام٪ S في المكتبة القياسية.هذا هو الإصلاح المفضل حيث أن البرنامج الخاص بك سيقوم بعد ذلك بالدليل ودية والعمل مهما كانت الأحرف التي تم تعيين أسماء الملفات التي تستخدمها.ومع ذلك، فإنه يعني أن جميع مهام الدفق أسفل ستحتاج إلى استخدام Unicode أيضا، مما قد يعني الكثير من العمل، اعتمادا على حجم المشروع.

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