2009-01-25 28 views
17

¿Cómo se analiza un número entero a string(char* || char[]) en C? ¿Hay un equivalente al método Integer.parseInt(String) de Java en C?Analizando entero a la cadena C

+0

Creo que lo obtuviste al revés: int Integer.parseInt (String)? –

Respuesta

43

Si desea convertir un entero en cadena, intente con la función snprintf().

Si desea convertir una cadena a un número entero, intente con la función sscanf() o atoi() o atol().

+6

Si desea verificar los errores, strtol o strtoul serían mejores que sscanf, atoi o atol. –

+0

'atoi' ha quedado obsoleto, no recomendaría su uso. – jacwah

1

La función Java parseInt() analiza una cadena para devolver un número entero. Una función C equivalente es atoi(). Sin embargo, esto no parece coincidir con la primera parte de su pregunta. ¿Desea convertir de un entero a una cadena, o de una cadena a un número entero?

1

También puede comprobar a cabo la función atoi() (ASCII a entero) y es atol parientes, y atoll, etc.

Además, hay funciones que hacen a la inversa, así, a saber itoa() y co.

14

Para convertir un int a una cadena:

int x = -5; 
char buffer[50]; 
sprintf(buffer, "%d", x); 

También puede hacerlo en dobles:

double d = 3.1415; 
sprintf(buffer, "%f", d); 

para convertir una cadena a un int:

int x = atoi("-43"); 

Ver http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ para la documentación de estas funciones.

+5

Hay un posible desbordamiento de búfer en su código, aunque no deseo calcular cuántos enteros de bits necesita para que suceda. Use snprintf(). – aib

+1

Para tener un desbordamiento de búfer allí, con espacio para 50 caracteres, necesitará tener enteros de 163 bits, asumiendo el caso positivo y la presencia de terminación nula. >>> Math.log (10 ** 49) /math.log (2) 162.77447664948076 – Arafangion

10

Suena como que tiene una cadena y desea convertir en un entero, a juzgar por la mención de parseInt, aunque no es muy claro a partir de la pregunta ...

Para ello, utilice strtol . Esta función es marginalmente más complicada que atoi, pero a cambio proporciona una indicación más clara de las condiciones de error, porque puede completar un puntero (que proporciona la persona que llama) con la dirección del primer carácter que lo confundió. La persona que llama puede luego examinar el personaje ofensivo y decidir si la cadena fue válida o no. atoi, por el contrario, simplemente devuelve 0 si se perdió, lo que no siempre es útil, aunque si está satisfecho con este comportamiento, entonces también podría usarlo.

A continuación se muestra un ejemplo de uso de strtol. La comprobación del error es muy simple: si el primer carácter no reconocido no era el '\x0' que termina la cadena, entonces se considera que la cadena no contiene un int válido.

int ParseInt(const char *s,int *i) 
{ 
    char *ep; 
    long l; 

    l=strtol(s,&ep,0); 

    if(*ep!=0) 
     return 0; 

    *i=(int)l; 
    return 1; 
} 

Esta función rellena en * i con el número entero y devuelve 1, si la cadena contiene un número entero válido. De lo contrario, devuelve 0.

+0

Dato curioso, las páginas man para atoi dicen que es equivalente a: (int) strol (str, (char * *) NULL, 10) –

2

Esto es discussed en Steve Summit's C Preguntas frecuentes.

+0

Me olvidé de ir a ese sitio web, jpekk. ¡Gracias por recordarme! – Paradius

0

Es posible que desee echar un vistazo a la solución compatible en this site.

0

Usted puede tratar de:

int intval; 
String stringval; 
//assign a value to intval here. 
stringval = String(intval); 

que debe hacer el truco.

+0

La pregunta es para C; esto no funcionará – iamnotmaynard

-1

Esta no es una solución óptima. Esta es mi solución debido a las múltiples restricciones, por lo tanto, si tuviera recursos limitados en función de las pautas de su curso/instructor, podría ser una buena opción para usted.

También tenga en cuenta que esta es una fracción de mi propio implemento de proyecto, y tuve que leer en operandos, así como dígitos, así que usé getchars. De lo contrario, si sólo necesita enteros y ningún otro tipo de caracteres, me gusta usar esto:

int k; 
while (scanf("%d", &k) == 1) 

Las reglas hubo, conceptos específicos C "avanzados": no hay variables de cadena, no hay estructuras, no hay punteros, no hay métodos no cubierto, y el único que incluimos que nos permitieron fue #include

Así que sin métodos simples como atoi() disponible o cualquier variable String para usar, elegí simplemente forzarlo brutalmente.

1: leer caracteres en el uso de getchar (se prohibió el uso de fgets). return 1 (exit status 1) si hay un caracter no válido. Para su problema basado en parseInt en Java 1 11 13 es válido pero 1 11 1a no es válido, por lo que para todos los valores tenemos una "cadena" válida si todos los caracteres están 0-9 ignorando espacios en blanco.

2: convertir el valor ASCII de un char a su valor entero (por ejemplo, 48 => 0.)

3: utilizar un val variable para almacenar un int tal que para cada caracter en una "subcadena" hay es un dígito entero correspondiente. es decir, "1234" => 1234 agrega esto a una matriz int y establece val en 0 para reutilizar.

El código siguiente muestra este algoritmo:

int main() { 
    int i, c; 
    int size = 0; 
    int arr[10]; //max number of ints yours may differ 
    int val = 0; 
    int chars[1200]; //arbitrary size to fit largest "String" 
    int len = 0; 

    //Part 1: read in valid integer chars from stdin 
    while((c = getchar()) != EOF && (c < 58 && c > 47)) { 
     chars[len] = c; 
     len++; 
    } 

    //Part 2: Convert atoi manually. concat digits of multi digit integers and 
    //  append to an int[] 
    for(i = 0; i < len; i++){ 
    for(i = 0; i < len; i++){ 
     if(chars[i] > 47 && chars[i] < 58){ 
     while((chars[i] > 47 && chars[i] < 58)){ 
      if(chars[i] == 48) 
       c = 0; 
      if(chars[i] == 49) 
       c = 1; 
      if(chars[i] == 50) 
       c = 2; 
      if(chars[i] == 51) 
       c = 3; 
      if(chars[i] == 52) 
       c = 4; 
      if(chars[i] == 53) 
       c = 5; 
      if(chars[i] == 54) 
       c = 6; 
      if(chars[i] == 55) 
       c = 7; 
      if(chars[i] ==56) 
       c = 8; 
      if(chars[i] == 57) 
       c = 9; 
      val = val*10 + c; 
      i++; 
     } 
     arr[size] = val; 
     size++; 
     if(size > 10) //we have a check to ensure size stays in bounds 
      return 1; 
     val = 0; 
     } 
     //Print: We'll make it a clean, organized "toString" representation 
     printf("["); 
     for(i = 0; i < size-1; i++){ 
      printf("%d, ", arr[i]); 
     } 
     printf("%d]", arr[i]; 

     return 0; 

Una vez más, este es el método de fuerza bruta, pero en casos como el mío, donde no es posible utilizar los conceptos de método la gente usa profesionalmente o varios instrumentos C99, este puede ser lo que estás buscando.