سؤال

لقد قمت بإنشاء برنامج يسمى الاختبار:

#include<stdlib.h>
#include<iostream>
int main()
{
    std::cout<<system("..\\add\\debug\\add.exe 4 8");
    while(true);
    return 0;
}

يتكون add.exe من

#include<stdlib.h>
int main(int argc,char **argv[])
{
    int n=((unsigned)argv[1]);
    int m=((unsigned)argv[2]);
    return(n+m);
}

لذلك عندما أقوم بإجراء الاختبار، أحصل على

6841420

كانت المحاولة هي إجراء اختبار تشغيل إضافة باستخدام المعلمتين 4 و8، ولإضافة لإرجاع مجموع تلك القيم (12) ثم يعرض الاختبار ذلك على الشاشة.كيف حصلت على 6841420 وكيف يمكنني إصلاحه؟

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

المحلول

المشكلة هي أنك تقوم بتحويل قيمة المؤشر إلى عدد صحيح.سيتم تمرير الوسائط إلى برنامجك كسلاسل نمط C (const char*).تحتاج أولاً إلى تحويلها إلى سلسلة باستخدام واجهة برمجة التطبيقات (API) مثل atoi.

#include<stdlib.h>
int main(int argc,char *argv[])
{
    int n= atoi(argv[1]);
    int m= atoi(argv[2]);
    return(n+m);
}

يحرر

كما أشار الآخرون، يجب عليك أيضًا إجراء بعض عمليات التحقق من الأخطاء للتأكد من وجود معلمتين تم تمريرهما إلى البرنامج.

نصائح أخرى

وadd.exe الخاص بك هو صب مؤشرات إلى السلاسل [إينتس] غير موقعة، لذلك فمن مضيفا مواقعهم في الذاكرة بدلا من الأرقام.

استخدم sscanf (أو، كما هو مقترح في إجابة أخرى، atoi - انها ربما أسهل).

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

والأجوبة حول استخدام atoi () أو sscanf () لتحويل ARGV [] عناصر من السلاسل إلى أعداد صحيحة الفعلية هي حق على نقطة.

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

ووcout<<system(...) خط طباعة هذا قيمة حالة. في العديد من المنابر (وخاصة تلك المتوافقة مع POSIX) إذا ركض العملية دون إنهاء غير طبيعي من البايت انخفاض رمز الحالة سوف يكون صفرا وسيتم البايت عالية القيمة التي تم تمريرها إلى exit() على افتراض أن قيمة 255 أو أقل.

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

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