hay causas fuera de rango error

Tengo este código que me da el error de terminating with uncaught exception of type std::out_of_range: stoi: out of range

que he identificado como la causada por la línea de long ascii = std::stoi(temp_string);

¿qué acerca de la manera en que yo estoy usando stoi es la causa de que y como puedo solucionarlo?

std::string encode(std::string message){
std::string num_value;
long cipher;
if(message.length() < 20){
  for(int i = 0; i < message.length(); ++i){
    int temp = (char) message.at(i); 
    num_value += std::to_string(temp); 
  }
  return num_value;
}
else{
    int count = 0;   
    std::string temp_string;
    for(int i = 0; i < message.length(); ++i){
      int temp = (int)  message.at(i);
      temp_string += std::to_string(temp);           
      count++;   
       if(count == 20){
         count = 0;
         //add cipher encrypt
         long ascii = std::stoi(temp_string);
         //cipher = pow(ascii, 10000);
         //add n to cipther encrypt
         //add cipherencrypt + n to num_value
         //reset temp_string
         temp_string += "n";

         temp_string = ""; 

      }
 }
return num_value;
}

int main(){
  std::string s = "Hello World my t's your name aaaaaaaaaaaaa?";
  std::cout<<"encoded value : "<< encode(s)<<std::endl;
}
  • ¿Has probado la impresión temp_string para ver si está en el rango de un int?
  • referencia de C++ tiene alguna información sobre su excepción: «std::out_of_range si el valor convertido caería fuera del rango del tipo de resultado o si la función subyacente (std::strtol o std::strtoll) establece el valor a ERANGE.»
  • ¿Qué es temp_string = ""; supone que debe hacer?
  • Dónde está su mínimo de la prueba, por favor? Usted incluso no nos dicen lo que tu entrada!!!
  • Simplemente añadiendo representaciones textuales de números juntos para hacer un mayor número? Se pierden los límites, ahora 979 podría ser 9,79 o 97,9 (ambos de los cuales son válidos y no tan inusuales secuencias)
  • He añadido como una edición.
  • Todavía te faltan incluye, una } (todo lo cual hace que su «prueba» error de compilación en total) y tiene las advertencias del compilador. Arreglar para producir una mínima prueba, por favor.

InformationsquelleAutor Rafa | 2015-04-28

1 Kommentar

  1. 8

    std::hay devuelve un entero; parece que su número es demasiado grande para un entero. Trate de usar std::stol lugar (ver aquí).

    También si usted tiene la intención para que el código sea portable (utilizable con diferentes compiladores/plataformas), tenga en cuenta que los números enteros y que anhela no tiene tamaño estándar. A menos que el tamaño mínimo dado por la estándar es suficiente, usted puede desear mirar en el uso de intX_t (donde X es el tamaño que desee), como se indica en la cstdint encabezado.

    • stol concuerda mejor con la variable el resultado se almacena a, sin embargo, esto probablemente no es todavía lo suficientemente grande.
    • Eso es un punto justo; yo había asumido el largo declaración significó la entrada era limitado, pero no veo ninguna tales restricciones en el código. No estoy seguro de qué más recomiendan, que no sea mover a tamaño arbitrario de las bibliotecas.
    • el contexto de la es un programa de cifrado rsa, y mi cifrado de la ruta de la elección fue para obtener los valores ascii en bloques de 20 caracteres, y pasar cada uno de los bloques en el c= pow(m, e) mod n fórmula. estoy tratando de guardar el bloque en una variable de cadena temporal, convertirlo a un número, poner en la fórmula, y repita el procedimiento para la cantidad de bloques.
    • En ningún paso en RSA cifrado debe ser el uso de dígitos decimales. Puede concatenar 20 caracteres en un gran número lo suficientemente fácil de usar bitshifts, pero necesitarías un 160 bits tipo de datos, que no creo que el compilador de C++ tiene. Qué tipo de datos es su pow(m, e) mod n función utilizando?
    • Estoy usando el gmp de la biblioteca para generar un número suficientemente amplio, por lo que los valores que están siendo aprobadas en que sería pasado el tiempo o int longitud

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea