1. Breve descripción

En lenguaje C, la conversión mutua entre enteros y cadenas tiene funciones extendidas ampliamente utilizadas (no estándar de la biblioteca), y también se puede intentar una implementación simple propia.


2. Conversión de entero a cadena

1. Función extendida itoa

itoa (significa integer to alphanumeric) es una función que convierte un número entero en una cadena.

En el entorno Windows, en el archivo de cabecera <stdlib.h> se tiene:

char* itoa(int value,char*string,int radix);//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数,如2,8,10,16 进制等。

Código fuente de la función:

char* itoa(int num,char* str,int radix) { char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//Tabla de índices unsigned unum;//Almacena el valor absoluto del entero a convertir, el entero a convertir puede ser negativo int i=0,j,k;//i se usa para indicar la posición correspondiente al establecer la cadena; después de la conversión, i es en realidad la longitud de la cadena; el orden después de la conversión está invertido; en caso de signo positivo/negativo, k se usa para indicar la posición inicial del ajuste de orden; j se usa para indicar el intercambio durante el ajuste de orden. //Obtiene el valor absoluto del entero a convertir if(radix==10&&num<0)//Se va a convertir a número decimal y es negativo { unum=(unsigned)-num;//Asigna el valor absoluto de num a unum str[i++]='-';//Establece el signo '-' al principio de la cadena e incrementa el índice en 1 } else unum=(unsigned)num;//Si num es positivo, se asigna directamente a unum //Parte de conversión, ten en cuenta que después de la conversión el orden está invertido do { str[i++]=index[unum%(unsigned)radix];//Toma el último dígito de unum, lo establece en la posición correspondiente de str e incrementa el índice en 1 unum/=radix;//Elimina el último dígito de unum }while(unum);//Hasta que unum sea 0, sale del bucle str[i]='\0';//Agrega el carácter '\0' al final de la cadena; las cadenas en C terminan con '\0'. //Ajusta el orden if(str[0]=='-') k=1;//Si es negativo, el signo no necesita ajuste, se ajusta desde después del signo else k=0;//Si no es negativo, todo se debe ajustar char temp;//Variable temporal, se usa al intercambiar dos valores for(j=k;j<=(i-1)/2;j++)//Intercambio simétrico de principio a fin uno a uno; i es en realidad la longitud de la cadena, el índice máximo es la longitud menos 1 { temp=str[j];//Asigna la cabeza a la variable temporal str[j]=str[i-1+k-j];//Asigna la cola a la cabeza str[i-1+k-j]=temp;//Asigna el valor de la variable temporal (que en realidad es el valor anterior de la cabeza) a la cola } return str;//Devuelve la cadena convertida }

Programa de ejemplo:

Ejemplo

#include <stdlib.h> #include <stdio.h> int main() { int number1 = 123456; int number2 = -123456; char string[16] = {0}; itoa(number1,string,10); printf("Número: %d La cadena convertida es: %s\n",number1,string); itoa(number2,string,10); printf("Número: %d La cadena convertida es: %s\n",number2,string); return 0; }

Captura del resultado:


2. Implementación simple propia

Código de implementación:

Ejemplo

#include <stdio.h> char* Int2String(int num,char *str);//Declaración de la función int main() { int number1 = 123456; int number2 = -123456; char string[16] = {0}; Int2String(number1,string); printf("Número: %d La cadena convertida es: %s\n",number1,string); Int2String(number2,string); printf("Número: %d La cadena convertida es: %s\n",number2,string); return 0; } char* Int2String(int num,char *str)//Base 10 (decimal) { int i = 0;//Indica el llenado de str if(num<0)//Si num es negativo, convierte num a positivo { num = -num; str[i++] = '-'; } //Conversión do { str[i++] = num%10+48;//Toma el dígito más bajo de num. Los códigos ASCII de los caracteres 0~9 son 48~57; en pocas palabras, dígito 0+48=48, el código ASCII corresponde al carácter '0' num /= 10;//Elimina el dígito más bajo }while(num);//Si num no es 0, continúa el bucle str[i] = '\0'; //Determina la posición de inicio del ajuste int j = 0; if(str[0]=='-')//Si hay signo negativo, el signo no necesita ajuste { j = 1;//Ajusta desde la segunda posición ++i;//Debido al signo negativo, el eje de simetría del intercambio también debe desplazarse 1 posición hacia atrás } //Intercambio simétrico for(;j<i/2;j++) { //Intercambia los valores de ambos extremos simétricamente. En realidad, ahorra la variable intermedia intercambiando los valores de a+b: a=a+b; b=a-b; a=a-b; str[j] = str[j] + str[i-1-j]; str[i-1-j] = str[j] - str[i-1-j]; str[j] = str[j] - str[i-1-j]; } return str;//Devuelve el valor convertido }

Captura del resultado:


3. Conversión de cadena a entero

1. Función extendida

atoi (significa alphanumeric to integer) es una función que convierte una cadena en un número entero.

En el entorno Windows, en el archivo de cabecera <stdlib.h>.

int atoi(const char *nptr);//Función de conversión de cadena a entero, nptr: la cadena a convertir

Código fuente de la función

int atoi(const char *nptr) { return (int)atol(nptr); } long atol(const char *nptr) { int c; /*El carácter actual a convertir (convierte los caracteres uno a uno en números)*/ long total; /*Resultado de la conversión actual*/ int sign; /*Indica si el resultado de la conversión lleva signo negativo*/ /*Omite los espacios; los espacios no se convierten*/ while ( isspace((int)(unsigned char)*nptr) ) ++nptr; c = (int)(unsigned char)*nptr++;//Obtiene un carácter listo para convertir sign = c; /*Guarda la marca del signo*/ if (c == '-' || c == '+') c = (int)(unsigned char)*nptr++; /*Omite los signos '+' y '-'; no se convierten*/ total = 0;//Establece el resultado de la conversión a 0 while (isdigit(c)) {//Si el carácter es un dígito total = 10 * total + (c - '0'); /*Según el código ASCII, convierte el carácter al dígito correspondiente y acumula multiplicando por 10 al resultado*/ c = (int)(unsigned char)*nptr++; /*Toma el siguiente carácter*/ } //Según la indicación del signo, devuelve el resultado con o sin signo negativo if (sign == '-') return -total; else return total; }

Programa de ejemplo:

Ejemplo

#include<stdio.h> #include<stdlib.h> int main() { printf("Cadena\"123456\"Convertida a número: %d\n",atoi("123456")); printf("Cadena\"-123456\"Convertida a número: %d\n",atoi("-123456")); return 0; }

2. Implementación simple propia

Código fuente de implementación:

Ejemplo

#include<stdio.h> int String2Int(char *str);//Declaración de la función int main() { printf("Cadena\"123456\"Convertida a número: %d\n",String2Int("123456")); printf("Cadena\"-123456\"Convertida a número: %d\n",String2Int("-123456")); return 0; } int String2Int(char *str)//Convierte cadena a número { char flag = '+';//Indica si el resultado lleva signo long res = 0; if(*str=='-')//La cadena lleva signo negativo { ++str;//Apunta al siguiente carácter flag = '-';//Establece el indicador como signo negativo } //Convierte carácter por carácter y acumula al resultado res while(*str>=48 && *str<=57)//Solo se convierte si es un dígito; códigos ASCII de los dígitos 0~9: 48~57 { res = 10*res+ *str++-48;//El código ASCII del carácter '0' es 48; 48-48=0, justamente se convierte en el dígito 0 } if(flag == '-')//Maneja el caso en que es negativo { res = -res; } return (int)res; }

Captura:


4. Uso de las funciones sprintf() y sscanf()

Conversión de entero a cadena

Código de prueba:

Ejemplo

#include <stdio.h> char* Int2String(int num,char *str);//Declaración de la función int main() { int number1 = 123456; int number2 = -123456; char string[16] = {0}; Int2String(number1,string); printf("Número: %d La cadena convertida es: %s\n",number1,string); Int2String(number2,string); printf("Número: %d La cadena convertida es: %s\n",number2,string); return 0; } char* Int2String(int num,char *str) { sprintf(str, "%d", num); return str; }

Resultado de la ejecución:

Conversión de cadena a entero

Código de prueba:

Ejemplo

#include<stdio.h> int String2Int(char *str);//Declaración de la función int main() { printf("Cadena\"123456\"Convertida a número: %d\n",String2Int("123456")); printf("Cadena\"-123456\"Convertida a número: %d\n",String2Int("-123456")); return 0; } int String2Int(char *str)//Convierte cadena a número { char flag = '+';//Indica si el resultado lleva signo long res = 0; if(*str=='-')//La cadena lleva signo negativo { ++str;//Apunta al siguiente carácter flag = '-';//Establece el indicador como signo negativo } sscanf(str, "%ld", &res); if(flag == '-') { res = -res; } return (int)res; }

Resultado de la ejecución:


5. Tabla de códigos ASCII adjunta (parcial)

Autor: Genven_Liang

Original: https://blog.csdn.net/nanfeibuyi/article/details/80811498