天天看點

c/c++整理--字元串(1)一、使用庫函數将數字轉化為字元串二、使用庫函數将字元串轉換為數字三、不使用庫函數将字元串轉化為數字四、程式設計實作strcpy函數五、程式設計實作memcpy函數六、strcpy與memcpy的差別

一、使用庫函數将數字轉化為字元串

C語言提供了幾個标準庫函數,可以将任意類型(整型、長整型、浮點型等)的數字任意轉化為字元串。 (1)itoa():  整型     轉化為      字元串 (2)ltoa():  長整型    轉化為      字元串 (3)ultoa():無符号長整型 轉化為      字元串 (4)gcvt(): 浮點型    轉化為      字元串 (5)ecvt(): 雙精度浮點型 轉化為      字元串,結果中不包含十進制小數點 (6)fcvt():  以指定位數為轉換精度,其餘同ecvt() (7)sprintf():可以将任意數字類型轉化為字元串,但是其速度較上面函數慢。

在Centos上man搜了一下,itoa、ltoa和ultoa在Centos6.7中并不存在,也就是說gcc編譯器無法識别這三個函數。另外幾個都有。        #include <stdlib.h>

       char *gcvt(double number, size_t ndigit, char *buf);

       char *ecvt(double number, int ndigits, int *decpt, int *sign);

       char *fcvt(double number, int ndigits, int *decpt, int *sign);

       int sprintf(char *str, const char *format, ...);

二、使用庫函數将字元串轉換為數字

和上面類似,C語言也提供了幾個标準庫函數,可以将字元串轉換為任意類型的數字。 (1)atof():    字元串  轉換為  雙精度浮點型型 (2)atoi():    字元串  轉換為  整型 (3)atol():    字元串  轉換為  長整型 (4)strtod(): 字元串  轉換為  雙精度浮點型,并報告不能被轉換的所有剩餘數字。 (5)strtol():  字元串  轉換為  長整型,并報告不能被轉換的所有剩餘數字。 (6)strtoul():字元串  轉換為  無符号長整型,并報告不能被轉換的所有剩餘數字。

       #include <stdlib.h>

       double atof(const char *nptr);

       int        atoi(const char *nptr);

       long     atol(const char *nptr);        double strtod(const char *nptr, char **endptr);

       long int strtol(const char *nptr, char **endptr, int base);              unsigned long int strtoul(const char *nptr, char **endptr, int base);

三、不使用庫函數将字元串轉化為數字

#include <iostream>

using namespace std;

int strtoint(char *str)
{
	if(str == NULL)				//函數入口參數檢查
	{
		return 0;
	}
	
	const char *pstr = str;
	int temp;					//臨時存放轉換後的資料
	
	if(str[0] == '+' || str[0] == '-')		//第一位為+/-時,先看後面的
	{
		str++;
	}
	
	while(*str)								//周遊字元串,如果字元在0~9,則轉化
	{
		if(*str < '0' && *str > '9')
		{
			break;
		}
		temp = temp*10 + *str - 48; 
		str++;
	}
	if(pstr[0] == '-')				//如果以‘-’開頭,取反
	{
		temp = -temp;
	}
	return temp;
}

int main()
{
	char str[20];
	cin.getline(str, 20);
	cout<<strtoint(str)<<endl;
	
	return 0;
} 
           

四、程式設計實作strcpy函數

strcpy函數原型:

#include <stdio.h>

void my_cpy(char* str1, char* str2)
{
	if(str1 == NULL || str2 == NULL)	//函數入口參數檢查
	{
		return;
	}
	
	while((*str1++ = *str2++) != '\0');	//将str2的所有内容複制到str1中
	return;
}

int main()
{
	char str1[] = "hello";
	char str2[] = "world";
	my_cpy(str1, str2);
	
	printf("%s\n%s\n", str1, str2);
	
	return 0;
} 
           

五、程式設計實作memcpy函數

記憶體複制的實作

#include <stdio.h>
#include <assert.h>

void my_memcpy(char* memto, const char* memfrom, size_t size)
{
	assert((memto != NULL) && (memfrom != NULL));		//入口參數檢查
	char *tempfrom = memfrom;
	char *tempto = memto;
	
	while(size-- > 0)
	{
		*tempto++ = *tempfrom++;
	}
}

int main()
{
	char str1[] = "hello world";
	char str2[20] = "";
	my_memcpy(str2, str1, 4);
	str2[4] = '\0';
	
	printf("%s\n", str2);
	
	return 0;
} 
           

memcpy函數有選擇性的複制字元串中的字元。程式中複制了str1的前四個字元。

六、strcpy與memcpy的差別

差別: (1)複制的内容不同。strcpy隻能複制字元串,memcpy可以複制任意内容,如字元串、整型、結構體和類等。 (2)複制的方法不同。strcpy不需要指定長度,它是遇到‘\0’結束的,memcpy是有其第三個參數決定。 (3)用途不同。通常在複制字元串時用strcpy,其他資料類型用memcpy。

繼續閱讀