"إيتوا":لا تأخذ الوظيفة وسيطة واحدة و"c":معرف غير مصرح به

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

  •  13-12-2019
  •  | 
  •  

سؤال

لقد كنت أحاول منذ يومين تشغيل هذا الرمز.لقد كان مجرد خطأ بعد خطأ.

هل يمكن لأي شخص أن يشير إلى ما أفعله خطأ؟

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int main()
{
    int h = 0;
    for(int a = 100; a<1000; a++)
        for(int b = 100; b<1000; b++)
            int c = a * b;
// Error: "c" is undefined
            if ((c == reverse(c)) && (c > h))
                h = c;
    cout << "The answer is: " << h << endl;
}

int reverse (int x)
{
// Error: "'itoa' : function does not take 1 arguments"
    string s = string(itoa(x));
    reverse(s.begin(), s.end());
  return (x);
}

استخدام std::to_string يعطيني المزيد من الأخطاء أيضًا.

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

المحلول

عندما يشرح لك المترجم شيئًا ما في رسالة خطأ، يجب أن تصدقه. itoa وهي في الواقع تأخذ أكثر من وسيطة، كما ترى في الرابط التالي:

http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

يحرر:أوه، وهذا يمكن تحقيقه باستخدام التعليمات البرمجية القياسية على نمط C++ بالمناسبة (تم إصلاح جزء من التعليمات البرمجية وفقًا للاقتراح في التعليقات):

int reverse(int x)
{
    std::stringstream ss;
    ss << x;

    std::string s = ss.str();
    std::reverse(s.begin(), s.end());

    ss.clear();
    ss.str(s.c_str());

    ss >> x;

    return x;
}

هنا.لست متأكدًا من أنه الحل الأنظف ولكنه يعمل على برنامج التحويل البرمجي الخاص بي.

يحرر:تعرف على كيفية استخدام سلسلة واحدة فقط هنا: كيفية مسح stringstream؟

نصائح أخرى

هل يمكنني اقتراح حل مختلف؟بدلا من القيام تحويلات السلسلة Int <->، يمكنك اختبار لمعرفة ما إذا كان الرقم هو palindrome بهذه الطريقة:

giveacodicetagpre.

ثم يصبح الاختبار الخاص بك:

giveacodicetagpre.

بالنسبة للمشكلة الأولى، قد توضح المسافة البادئة الصحيحة ما يلي:

int h = 0;
for(int a = 100; a<1000; a++)
    for(int b = 100; b<1000; b++)
        int c = a * b;

if ((c == reverse(c)) && (c > h))
    h = c;

مع بعض الأقواس الإضافية:

int h = 0;
for(int a = 100; a<1000; a++)
{
    for(int b = 100; b<1000; b++)
    {
        int c = a * b;
        if ((c == reverse(c)) && (c > h))
            h = c;
    }
}

أما بالنسبة لل itoa القضية، توقيعها هو:

char *  itoa ( int value, char * str, int base );

لذلك لا يمكنك الكتابة فقط itoa(x) ونتوقع أن يعود سلسلة.

ولكن هناك طريقة أفضل لتحويل ملف int إلى أ string في سي ++

  • إذا كان لديك C++ 11، هناك std::to_string
  • خلاف ذلك، أ std::stringstream سوف يقوم بهذه المهمة.

مثل ذلك:

#include <sstream>

int reverse (int x)
{
    std::stringstream ss;
    ss << x;
    string s(ss.str());
    reverse(s.begin(), s.end());
    return (x);
}

لاحظ أن هذا لن يعيد ملف int عكس بالرغم من ذلك.

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