itoa的源代碼實現


由於通過socket傳遞數據的時候,僅僅能夠通過字符串類型,可是,當我們要傳遞的數據是整型的是,應該怎么辦呢?本來我想着使用for循環,可是,總感覺太麻煩了,后來別人告訴我能夠使用itoa,以下是itoa的原型:

char *itoa(int value, char *string, int radix);

舉比例如以下:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char arr[10];
	int a=123456;
	itoa(a,arr,10);
	cout<<arr<<endl;
	cout<<strlen(arr)<<endl;
	return 0;
}


可是,正在高興的時候,才發如今Unix下沒有itoa函數,上網上一搜,才發現itoa不是標准的C語言函數,以下是百度百科中的解釋:

itoa是廣泛應用的非標准C語言擴展函數。因為它不是標准C語言函數,所以不能在全部的編譯器中使用。可是,大多數的編譯器(如Windows上的)通常在<stdlib.h>頭文件里包括這個函數。在<stdlib.h>中與之有相反功能的函數是atoi。

 

那應該怎么辦呢?

后來同事告訴我,能夠使用萬能的sprintf啊,我恍然大悟,以下舉一個小樣例:

#include <iostream>
using namespace std;
int main()
{
	char arr[10];
	int a=123;
	sprintf(arr,"%d",a);
	cout<<arr<<endl;
}

 

我當時挺想知道itoa內部究竟是怎么實現的,在網上搜了一個樣例,感覺寫的的挺不錯的,我把這個實現itoa的源代碼的文件改動了一下,能夠執行了,以下是源代碼:

#include <stdlib.h> 
#include <stdio.h> 
char *myitoa(int num,char *str,int radix);
int main() 
{ 
	int number = -123456; 
	char string[25]; 
	myitoa(number, string, 16); 
	printf("integer = %d string = %s\n", number, string); 
	return 0; 
} 
/* 實現itoa函數的源碼 */ 
char *myitoa(int num,char *str,int radix) 
{  
	/* 索引表 */ 
	char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	unsigned unum; /* 中間變量 */ 
	int i=0,j,k; 
	/* 確定unum的值 */ 
	if(radix==10&&num<0) /* 十進制負數 */ 
	{ 
		unum=(unsigned)-num; 
		str[i++]='-'; 
	} 
	else unum=(unsigned)num; /* 其它情況 */ 
	/* 逆序 */ 
	do  
	{ 
		str[i++]=index[unum%(unsigned)radix]; 
		unum/=radix; 
	}while(unum); 
	str[i]='\0'; 
	/* 轉換 */ 
	if(str[0]=='-') k=1; /* 十進制負數 */ 
	else k=0; 
	/* 將原來的“/2”改為“/2.0”,保證當num在16~255之間,radix等於16時,也能得到正確結果 */ 
	char temp; 
	for(j=k;j<=(i-k-1)/2.0;j++) 
	{ 
		temp=str[j]; 
		str[j]=str[i-j-1]; 
		str[i-j-1]=temp; 
	} 
	return str; 
} 


擴展閱讀: http://baike.baidu.com/view/982195.htm

 

我在網上搜memcpy的時候,網上有一句話“memcpy能夠復制隨意內容,比如字符數組、整型、結構體、類等”,所以我想着使用memcpy應該也能夠實現上面這個問題,希望看過這篇文章的不吝賜教一下,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM