c/c++面試題(8)memcopy/memmove/atoi/itoa
1.memcpy函數(shù)的原型:
void* memcpy(void* dest,cosnt void* src,size_t n);
返回值:返回dest;
功能:從源內(nèi)存地址src拷貝n個字節(jié)到dest內(nèi)存地址.
這里必須要求源地址的內(nèi)存和目標(biāo)地址的內(nèi)存沒有覆蓋,如果有覆蓋結(jié)果是未定義的.
#include <stdio.h> #include <assert.h> void* my_memcpy(void* dest,const void* src,size_t n) { assert(dest != NULL && src != NULL && n > 0); char* dest_t = (char*)dest; const char* src_t = (char*)src; while(n--) *dest_t++ = *src_t++; return dest; } int main(void) { char str[] = "abcedf"; char buf[20] = "aaaaaaaa"; my_memcpy(str,buf,sizeof(str)); printf("%s\n",(char*)str); return 0; }
2.memmove的原型:
void* memmove(void* dest,const void* src,size_t n);
和memcpy的功能差不多,只是多了一層考慮內(nèi)存有覆蓋的情況.
如果dest比src小,就從低地址開始拷貝.
如果dest比src大,就從高地址開始拷貝.
如果dest和src一樣,就不拷貝.
#include <stdio.h> void* my_memmove(void* dest,const void* src,size_t n) { char* d = (char*)dest; const char* s = (char*)src; if( d < s) //start copying at begining while dest is little { while(n--) *d++ = *s++; } else if(d > s) //start copying at end while dest is bigger { d += n - 1; s += n - 1; while(n--) *d-- = *s--; } return dest; }
3.atoi的原型:
int my_atoi(char* pstr)
功能:將字符串轉(zhuǎn)換成整型數(shù);atoi()會掃描參數(shù)nptr字符串,跳過前面的空格字符,直到遇上數(shù)字或正負(fù)號
才開始做轉(zhuǎn)換,而遇到非數(shù)字或字符'\0'結(jié)束轉(zhuǎn)換,并將結(jié)果返回.(返回轉(zhuǎn)換后的整型數(shù));
#include <stdio.h> #include <assert.h> int my_atoi(char* pstr) { assert(pstr != NULL); int res = 0; int sign = 1; while(*pstr == ' '|| *pstr == '\t') pstr++; sign = (*pstr == '-'? -1 : 1); /*求得符號位置*/ if(*pstr == '-' || *pstr == '+') /*跳過符號位置*/ pstr++; while(*pstr != '\0' && *pstr >= '0' && *pstr <= '9') { res = *pstr - '0' + res*10; pstr++; } return sign*res; /*返回帶符號的值*/ } int main(void) { char a[] = "-110000"; char b[] = " 456"; int c = 0; c = my_atoi(a); printf("%d\n",c); c = my_atoi(b); printf("%d\n",c); return 0; }
4.itoa的原型:
浙公網(wǎng)安備 33010602011771號