1. 程式人生 > >C++面試常見的幾個庫函式詳解

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*); 作用