'itoa' :la función no toma 1 argumentos & 'c' :identificador no declarado
Pregunta
He estado tratando durante 2 días ahora para que este código funcione.Simplemente ha sido error tras error.
Puede alguien señalar lo que estoy haciendo mal?
#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);
}
Usar std::to_string sólo me da más errores así.
Solución
Cuando su compilador le explica algo en un mensaje de error, debe creerlo.De hecho, itoa
hace, de hecho, toma más de un argumento, como puede ver en el siguiente enlace:
http://www.cplusplus.com/reference/clibrary/cstdlib/iTOA /
Editar: Oh y esto es alcanzable usando el código de estilo estándar, C ++ por cierto (arreglado un poco de código según su sugerencia en los comentarios):
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;
}
aquí.No estoy seguro de que sea la solución más limpia, pero funciona en mi compilador.
Editar: Se enteró de cómo usar un solo flujo de cuerdas aquí: ¿Cómo borrar Stradstream?
Otros consejos
¿Puedo sugerir una solución diferente?En lugar de hacer las conversiones de cadenas INT <-> que puede probar para ver si un número es un palíndromo de esta manera:
bool is_palindrome(int number, int base = 10)
{
int rebmun = 0;
for (int temp = number; temp != 0; temp /= base) {
rebmun = (rebmun * base) + (temp % base);
}
return number == rebmun;
}
entonces su prueba se convierte en:
if (is_palindrome(c) && (c > h))
Para el primer problema, corrija la sangría podría dejarlo claro:
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;
Con algunos extra entre paréntesis:
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;
}
}
Como para el itoa
problema, su firma es:
char * itoa ( int value, char * str, int base );
así que usted no puede simplemente escribir itoa(x)
y espera que devuelva una cadena de caracteres.
Sin embargo, hay una mejor manera de convertir un int
a un string
en C++
- si usted tiene C++11,
std::to_string
- de lo contrario, una
std::stringstream
va a hacer el trabajo.
Así:
#include <sstream>
int reverse (int x)
{
std::stringstream ss;
ss << x;
string s(ss.str());
reverse(s.begin(), s.end());
return (x);
}
Tenga en cuenta que esto no va a devolver el int
invierte sin embargo.