在linux中有许多时候我们需要将int数组转换为字符数组,或者字符串,但是没有itoa之类的函数怎么办?
下面有几种int数组与字符串互转的方法,以及一些需要注意的小的细节。
int main(){
int *arry= NULL;
arry = malloc(128);
memset(arry,0x0,128);
char str[] = "0,1,2,3,4,6,7,8,9,10,11,12,13,1";
char delimes[] = ",";
char *result = NULL;
int i = 0;
int j = 0;
char tmp[256] = {0};
/*将字符串转化为int数组*/
result = strtok(str+1,delimes);
while(result != NULL){
arry[i] = atoi(result);
i++;
result = strtok(NULL,delimes);
}
for(j = 0; j < 32; j++)
{
printf("arry[%d]=%d\n",j,arry[j]);
}
/*将int数组转化为字符串(还原原来的字符串),有两种方法*/
/*第一种很麻烦,但有利于我们理解数字和字符之间的转化*/
int index,in = 0,
for(index = 0; index < 32; index++){
/*没错,当这个数字小于10的时候,加'0'其实就是ASCII值*/
if(arry[index] < 10)
{
tmp[in] = arry[index] + '0';
}
/*当这个数字大于10的时候,直接加'0'的ASCII值是“:”,此时将得不到想要的10
*所以要用两部分来存储,第一部分用一个字节存储十位,第二部分用一个字节存储个位
*
*/
else if(arry[index] >= 10 && arry[index] < 100){
// sprintf(tmp+in, "%d", arry[index]); //此时只能
tmp[in] = arry[index]/10 + '0';
in = in + 1;
tmp[in] = arry[index]%10 + '0';
}
in = in+1;
tmp[in] = ',';
in = in+1;
}
/*第二种比较简单的方法,直接用字符串进行拼接*/
char tmppp[8] = {0};
for(index = 0; index < 32; index++){
strcat(tmp,",");
sprintf(tmppp, "%d", arry[index]);
strcat(tmp,tmppp);
}
/*printf输出的小细节*/
in = 0;
sprintf(tmp+in, "%d", 1);// 1转化为字符串以字符存储时需要占用一个字节
/*tmp[in+1] = '0'- 48; 可以用来验证printf遇到字符ASCII值为0时会停止输出*/
in = in + 2;
tmp[in] = ';';
printf("%s\n",tmp); // 此处是1,为什么不是1;呢?原因是printf遇到字符ASCII值为0时会停止输出
printf("c=%d\n",tmp[1]);// 0
printf("c=%d\n",tmp[2]);// 59
in = 0;
sprintf(tmp+in, "%d", 12);// 12转化为字符串以字符存储时需要占用两个字节
printf("tmp[%d]=%02x\n",in,tmp[in]); // 字符1 = 十六进制的31 = 十进制的49
printf("tmp[%d]=%02x\n",in+1,tmp[in+1]); // 字符2 = 十六进制的32 = 十进制的50
in = in + 2;
tmp[in] = ';';
printf("%s\n",tmp); // 12;
printf("c=%d\n",tmp[0]);// 49
printf("c=%d\n",tmp[1]);// 50
printf("c=%d\n",tmp[2]);// 59
}