سؤال

Visual Studio يصرخ في وجهي حول استخدام itoa() القول للاستخدام _itoa() في حين أن؟

يبدو لي وكأنهم نفس الوظيفة. ما يعطي؟

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

المحلول

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

لو _CRT_NONSTDC_NO_WARNINGS تم تعريفه ، لن يشكو برنامج التحويل البرمجي MS itoa() وظيفة يجري إهمالها. لكنه سيظل يشتكي من كونه غير آمن (عليك أن تحدد _CRT_SECURE_NO_WARNINGS لتهدئة هذا التحذير). أو استخدم النسخة الأكثر أمانًا من الوظيفة (_itoa_s()) التي توفر الوظيفة مع حجم المخزن المؤقت الوجهة

كلاهما _itoa() و itoa() حل إلى نفس الوظيفة بالضبط في المكتبة وصولاً إلى نفس العنوان - لا يوجد فرق إلا في الاسم.

نصائح أخرى

ال وثائق MSDN ل itoa() يقول:

تم إهمال وظيفة POSIX هذه بداية في Visual C ++ 2005. استخدم مطابقة ISO C ++ _itoa أو محسنة الأمن _itoa_s في حين أن.

Itoa ليس قياسيًا C.

"لم يتم تعريف هذه الوظيفة في ANSI-C وليست جزءًا من C ++ ، ولكنها مدعومة من قبل بعض المترجمين." - cplusplus.com

لذا فإن MSVS يطلب منك استخدام _itoa لإخبارك أنه ليس C ++ قياسي وأنه يجب عليك وضع علامة عليه على هذا النحو. أعتقد أنه موجود للتوافق مع الوراء وأن هذا التدوين مخصص للقراءة والتمييز.

itoa ليس قياسيًا ، لذلك يجب عليك استخدام StringStream بدلاً من ذلك.

انك سوف تحتاج #include <sstream>

مثال على استخدامه هو:

int i = 5;
std::stringstream ss;

ss << i;

std:: cout << ss.str();

ردا على إجابة بروس:

itoa ليس قياسيًا ، لذلك يجب عليك استخدام StringStream بدلاً من ذلك.

انك سوف تحتاج #include <sstream>

مثال على استخدامه هو:

int i = 5; std::stringstream ss;

ss << i;

std:: cout << ss.str();

يمكنك أيضًا ترميز خاصتك itoa() وظيفة بدلا من ذلك

على سبيل المثال:

const char* itoa (int num)
{
    if (num == 0)
    {
        return "0";
    }
    bool neg = false;
    if (num < 0)
    {
        neg = true;
        num = -num;
    }

    int digits = 0;
    int tmp = num;

    while (tmp > 0)
    {
        digits++;
        tmp /= 10;
    }

    int digs[digits];

    for (tmp = digits; num > 0; tmp--)
    {
        digs[tmp] = num % 10;
        num /= 10;
    }

    string s = neg == true ? "-" : "";
    for (tmp = 1; tmp <= digits; tmp++)
    {
        s += (char)(digs[tmp] + 48);
    }
    return s.c_str();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top