C++面試常見的幾個庫函式詳解
strcpy()
原型宣告:char strcpy(char dest, const char *src);
功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。
返回指向dest的指標。
#include <assert.h>
char* *strcpy(char* dest, constchar *src) //point1: 源字串不改變,需要加const保證{
assert(NULL != dest && NULL != src); //point2:保證指標有效
char * temp = dest; //point3:下面涉及到指標的移動,而我們需要返回dest的頭指標,所以dest保留,而使 用temp來移動
while ((*temp++ = *src++) != '\0'); /* point4:末尾的'\0'也要複製過來
* 上面先執行 *temp++ = *src++ ,再判斷 *src 是否等於'\0'
* 所以保證了'\0'先複製後判斷
*/
return dest; //point5:返回dest頭指標,支援鏈式表示式
}
鏈式的例子:
int length = strlen (strcpy(strA, strB));
- 1
strncpy()
strcpy()是一個高危函式,因為沒有指定複製的大小,當dest的空間比src小時,就會出錯,而我們沒法進行控制。於是有了比較安全的strncpy():
//把src所指向的字串中以src地址開始的前n個位元組複製到dest所指的陣列中,並返回dest。#include <assert.h>char *strncpy(char* dest, constchar *src, unsignedint n) { assert(NULL != dest && NULL != src); char
* temp = dest; while (n-- > 0 && (*temp++ = *src++) != '\0'); /* 上面語句兩種終止情況: * 1. n = 0,此時下面的語句也不執行,如果未達到src末尾 * 不會自動在dest末尾新增'\0'的,所以需要使用者自己新增 * 2. n > 0 但是src已經到達末尾,那麼執行下面語句,將 * dest填充'\0'達到長度n(ANSI C規定) */while (n-- > 0) *temp++ = '\0'; return dest; }
strcmp()
比較兩個字串
設這兩個字串為str1,str2,
若str1==str2,則返回零;
若str1>str2,則返回正數;
若str1
#include <assert.h>intstrcmp(constchar *str1, constchar *str2)
{
assert(NULL != str1 && NULL != str2);
/*不可用while(*str1++==*str2++)來比較,當不相等時仍會執行一次++,
return返回的比較值實際上是下一個字元。應將++放到迴圈體中進行。*/
while(*str1 && *str2 && *str1 == *str2) { str1++; str2++; } return *str1 - *str2; /* 若相等,則*str1 - *str2 = '\0' - '\0' = 0; * 否則,*str1 - *str2 != 0; * 因為前面的位都相等,所以只需要比較當前位來確定返回值 */ }
strcat()
把src所指字串新增到dest結尾處(覆蓋dest結尾處的’\0’)。
char *strcat(char *dest,constchar *src) { assert(NULL != dest && NULL != src); char *temp = dest; while ('\0' != *temp) //自增放在迴圈裡,才可以覆蓋'\0' ++temp; while ((*temp++ = *src++) != '\0'); return dest; }
strlen()
功能:計算給定字串的(unsigned int型)長度,不包括’\0’在內
說明:返回s的長度,不包括結束符NULL。
unsignedintstrlen(constchar *s) { assert(NULL != s); unsignedint len = 0; while (*s++ != '\0') ++len; return len; }
memset()
void *memset(void *s, int ch, size_t n);
函式解釋:將s中前n個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s 。
memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。
注意,memset是以【位元組】為單位進行賦值的,因此下面用法將導致錯誤:
int arr[5]; memset(array,1,sizeof(arr));
arr指向5個位元組的空間,每個都用ASCII為1的字元去填充,轉為二進位制後,1就是00000001,佔一個位元組。一個INT元素是4位元組,合一起就是00000001000000010000000100000001,就等於16843009,就完成了對一個INT元素的賦值了。所以上面結果不是1而是16843009!
void *memset(void *s,int c,unsignedint n) //point1:s指標型別未知,另外,n為位元組數! { assert(NULL != s); void *temp = s; while (n--) { *(char *temp) = (char)c; //point2:轉化為字元(1位元組) temp = (char *)temp + 1; //point3:不能自增,因為不知道指標型別 } return s; }
memcpy()
記憶體拷貝函式,memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。
void *memcpy(void *dest, constvoid *src, size_t n) { assert(NULL != dest && NULL != src); int i = 0; void *temp = dest; while (i < n) { *((char *)temp + i) = *((char *)src + i); //未知型別,不能自增 ++i; } return dest; }
atoi()
這個函式就比較經典了,面試常常出現,因為可以考察各種特殊情況:空指標、空串、正負號、非法字元、溢位等等。
最大的int:0x7FFF FFFF;
最小的int:0x8000 0000;
enum = {Invalid = 0, Valid};
bool errno = Invalid;
int atoi(const char * str)
{
longlong num = 0; //point1:可能溢位,所以用long long存
errno = Invalid;
if (NULL != str && *str != '\0') //point2
{
bool minus = false;
if (*str == '+')
{
++str;
}
elseif (*str == '-')
{
++str;
minus = true;
}
if ('\0' != *str) //只有符號,Invalid
atoiCore(str, minus, num);
}
return (int)num; //已經檢查過溢位,保證了num在int範圍內
}
void atoiCore(const char *str, bool minus, longlong &num)
{
while ('\0' != *str)
{
if (*str >= '0' && *str <= '9')
{
num = num*10 + (*str) - '0';
++str;
if ((!minus && num > 0x7FFFFFFF)||(minus && (-num) < (signed int)0x80000000))
{
errno = Invalid;
num = 0;
return;
}
}
else
{
errno = Invalid;
num = 0;
return;
}
}
if (minus)
num = -num;
errno = Valid;
}
相關推薦
C++面試常見的幾個庫函式詳解
strcpy() 原型宣告:char strcpy(char dest, const char *src); 功能:把從src地址開始且含有NULL結束符的字串複製到以dest開始的地址空間 說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容
C程式中對時間的處理——time庫函式詳解
功 能:將時間格式化,或者說:格式化一個時間字串。我們可以使用strftime()函式將時間格式化為我們想要的格式。 原 型:size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timept
常見幾個字串函式實現程式碼
(1)size_t strlen(const char *str); size_t strlen(const char *str) { assert(str != NULL); unsigned int cnt = 0; while(*str++) ++cnt
python中的幾個高階問題詳解(__init__,裝飾器執行步驟,@staticmethod和@classmethod區別,單例模式,魔法方法,object繼承與不繼承區別)
第一個問題,init 在定義一個類時,什麼時候用__init__函式,什麼時候不用,用不用有什麼區別? 首先__init__是為了初始化用的,但是初始化的時候不一定要用這個,直接定義也是可以的,比如 class A(object): test_a = '123' 而我們用__
STM32庫函式詳解----(外部中斷/事件控制器 EXTI)
1.void EXTI_DeInit (void) 函式解釋:將EXTI外設暫存器重置為默註釋。RCC_APB2PeriphResetCmd引數中沒有EXTI外設的的巨集,該外設重置採取的是直接向暫存器賦預設值的操作。 例子:EXTI_DeInit ( );
STM32庫函式詳解----(通用輸入/輸出GPIO)
初始化和配置相關函式 1.void GPIO_DeInit (GPIO_TypeDef* GPIOx) 函式解釋:gpio的反初始化函式,該函式的作用是把GPIO相關的暫存器配置成上電覆位後的預設狀態,在第一次初始化前或者不在使用某一介面後,可以呼叫該函式。 引數
類和物件-中(6個預設函式詳解)
本文主要是對類的6個預設函式進行講解 類的預設成員函式有6個:建構函式 解構函式
Java執行緒池(2)——執行緒池中的幾個重要方法詳解
【內容摘要】 在java中,如果需要進行多執行緒程式設計,可以採用java自帶的執行緒池來實現,執行緒池對於我們新手來說是一個非常好的選擇,因為我們可以不用關心執行緒池中執行緒是如何排程的,避免在多執行緒程式設計過程產生死鎖等問題。在瞭解執行緒池的使用前,本文
libxml2庫函式詳解
許多事物符合80/20法則,libxml中也是20%的函式提供了80%的功能。下面的列表列出了libxml的主要函式及其用法說明。 1. 全域性函式說明 標頭檔案引用 xml2config --cflags 庫檔案引用 xml2config -
#include 庫函式詳解
time.h 有人總結成這麼幾句,的確是經典,自己好好程式設計試試效果吧, 兩個型別: time_t:表示距離 UTC 時間 1970-01-01 00:00:00 的秒數。也叫做日曆時,型別是 long clock_t: 只用於程式計時,貌似其他的沒它什麼事。struc
STM32 DSP庫函式詳解
對於每個函式,都存在浮點數和定點數的型別,由於使用方法是一致的,這裡我們僅以32為浮點數為例來說明。 一.BasicMathFunctions 1.絕對值 pDst[n] = abs(pSrc[n]), 0 <= n < blockSize 示例 float3
導航欄下extendedLayoutIncludesOpaqueBars、automaticallyAdjustsScrollViewInsets等幾個屬性的詳解
在引入了導航控制器UINavigationController和分欄控制器UITabBarController之後,我們在設定控制元件的frame的時候就需要注意避開導航欄UINavigationBar 44+電源欄UIStatusBar 20的高度,和底部分欄UITabBar 44的高度。底部分欄並
Java一個漢字佔幾個位元組(詳解與原理)
1、先說重點: 不同的編碼格式佔位元組數是不同的,UTF-8編碼下一個中文所佔位元組也是不確定的,可能是2個、3個、4個位元組; 2、以下是原始碼: 1 @Test 2 public void test1() throws UnsupportedEncodingE
面試中常見的字串庫函式程式設計
下面對一些常見的關於字元的庫函式進行實現,這些也是通常面試中所問的一些問題,需要注意的是有些看起來很簡單,但是一定要考慮一些邊界條件,否則很容易出錯. strcpy實現 char* strcpy(char* dst,const char* src){
CRC16常見幾個標準的演算法及C語言實現
CRC16常見的標準有以下幾種,被用在各個規範中,其演算法原理基本一致,就是在資料的輸入和輸出有所差異,下邊把這些標準的差異列出,並給出C語言的演算法實現。CRC16_CCITT:多項式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在後,結果與0
程式設計師面試的幾個常見的問題(1)
1.什麼是面向物件?對於面向物件,它是java程式的一種程式設計思想。那麼它有四種基本特徵:抽象、封裝、繼承、多型抽象:抽象可以分為抽象類和抽象方法;抽象類①使用abstract關鍵字來定義抽象類②抽象類能被繼承③抽象類不能例項化(即不能建立抽象類的例項,但是可以先例項化抽象
Loadrunner關於頁面檢查的幾個函式詳解
環境:51Testing軟體測試網]~d$s7C_Loadrunner版本:8.0h3o B4xH.^'| V7QV247706自建一個test.html檔案:51Testing軟體測試網L+/,@+|(TX7p<html>51Testing軟體測試網$l]7QF
C++ 輸入流 cin/ ifstream/ istringstream 及幾個相關函式在遇到檔案結束符EOF時的行為
以下內容分別在VC6.0 和 g++ 4.7下測試: 輸入流在遇到檔案結束符時會設定其eofbit,但此時在兩個編譯器上直接測試流得到的結果都為真,同時eof()也為真,舉例如下: #include <iostream> #include <string&
CGRect常見方法和幾個CGRect函式
主題:CGRect,每個檢視都使用一個邊框定義其界限。這個邊框指定了檢視的輪廓:位置、寬度和高度 內容:對於邊框,通常表示由原點(CGPoint,x和y)和大小(CGSize,寬度和高度)組成的CGR
一天一個庫函式-for C
1.對連續記憶體下的資料進行快速排序 <stdlib.h> void qsort(void *buf, size_t num, size_t size, int (*compare)(const void* ,const void*); 作用