1. 程式人生 > >2016 C語言面試題——字串函式的實現

2016 C語言面試題——字串函式的實現

2016 C語言面試題——字串函式

前言:最近準備找工作了,所以需要做一些準備。先從基本的字串函式的實現開始。如果有發現什麼問題或有什麼疑惑,請及時評論。

strcat

/*************************************************************************
    > File Name: strcat.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 20時08分29秒
 ************************************************************************/
/* * 連線字串 */ #include<stdio.h> char *my_strcat(char *dest,const char *src) { char *temp = dest; const char *s = src; while(*temp != '\0') temp++; while((*(temp++) = *(s++)) != '\0'); temp = '\0'; return dest; } int main(void) { char dest[] = "he"; const
char src[] = "llo"; printf("%s\n",my_strcat(dest,src)); return 0; }

strchr

/*************************************************************************
    > File Name: strchr.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 19時55分12秒
 *****
*******************************************************************/ /* * 查詢字串中字元c第一次出現的位置 */ #include<stdio.h> #include<assert.h> char *my_strchr(const char *str,int c) { assert(str); const char *p = str; while(*p) { if(*p == c) { return p; } p++; } return NULL; } int main(void) { char str[] = "abcd"; printf("%c\n",*my_strchr(str,'b')); return 0; }

strlen

/*************************************************************************
    > File Name: strlen.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年08月15日 星期六 16時24分06秒
 ************************************************************************/

/*
 *strlen的實現
 */

#include<stdio.h>

unsigned int my_strlen(const char * str)
{
    const char *tmp = str;
    int i;

    for(i=0;*tmp++ != '\0';i++);

    return i;
}

int main(void)
{
    char string[]= "answer";

    printf("%d\n",my_strlen(string));

    return 0;
}

strcpy

/*************************************************************************
    > File Name: strcpy.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 16時11分34秒
 ************************************************************************/

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

char *my_strcpy(char *dest,const char *src)
{
    if(dest == src)
    {
        return dest;
    }

    assert(dest != NULL);
    assert(src != NULL);

    char *temp = dest;

    while((*(dest++) = *(src++)) != '\0');

    return temp;
}

int main(void)
{
    const char src[] = "answer nihao";
    char *dest = (char *)malloc(sizeof(src));

    printf("%s\n",my_strcpy(dest,src));

    return 0;
}

memcpy

/*************************************************************************
    > File Name: memcpy.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 16時20分44秒
 ************************************************************************/

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

void *my_memcpy(void *dest,const void *src,size_t n)
{
    if(n <= 0)
    {
        return NULL;
    }

    assert(dest != NULL);
    assert(src != NULL);

    void *temp = dest;

    while(n--)
    {
        *(char *)(dest++) = *(char *)(src++);
    }

    return temp;
}

int main(void)
{
    const char src[]="answer nihao";
    char *dest = (char *)malloc(sizeof(src));

    printf("%s\n",(char *)my_memcpy(dest,src,sizeof(src)));

    return 0;
}

memmove

/*************************************************************************
    > File Name: memmove.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 16時54分18秒
 ************************************************************************/

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

void *my_memmove(char *dest,const char *src,size_t n)
{
    if(n == 0)
    {
        return NULL;
    }

    assert(dest != NULL);
    assert(src != NULL);

    const char *a = src;
    char *b = dest;

    if(src >= dest || (src + n) <= dest)
    {
        while(n--)
        {
            *(b++) = *(a++);
        }
    }
    else
    {
        a += n;
        b += n;
        while(n--)
        {
            *(b--) = *(a--);
        }
    }

    return dest;
}


int main(void)
{
    char s[] = "hello";

    printf("%s\n",(char *)my_memmove(s,s+1,sizeof(s)-1));

    return 0;
}

loopmove

/*************************************************************************
    > File Name: loopmove.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 20時16分09秒
 ************************************************************************/

/*
 * 迴圈右移
 */


#include<stdio.h>
#include<string.h>

#define MAX 256

void loopmove(char * str,int steps)
{
    char tmp[MAX];
    int len = strlen(str) - steps;

    memmove(tmp,str+len,steps);
    memmove(str+steps,str,len);
    memmove(str,tmp,steps);
}

int main(void)
{
    char str[] = "123456";

    loopmove(str,2);
    printf("%s\n",str);

    return 0;
}

del_cp

/*************************************************************************
    > File Name: del_cp.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 19時27分49秒
 ************************************************************************/

/*
 * 刪除字串中的a,並複製b。
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    char s[] = "aabcbba";
    int i,j;
    int n = 0,count = 0;
    int len = strlen(s);

    for(i=0;i<len;i++)
    {
        if(s[i] != 'a')
        {
            s[n++] = s[i];
        }
        if(s[i] == 'b')
        {
            count++;
        }
    }

    s[n] = '\0';

    int newlen = count + n;
    s[newlen] = 0;

    /*倒序複製,不會打亂字串順序*/
    for(i=newlen-1,j=n-1;j>=0;j--)
    {
        s[i--] = s[j];
        if(s[j] == 'b')
        {
            s[i--] = s[j];
        }
    }

    printf("%s\n",s);

    return 0;
}

01swap

/*************************************************************************
    > File Name: 01swap.c
    > Author: AnSwEr
    > Mail: [email protected]
    > Created Time: 2015年10月07日 星期三 12時40分43秒
 ************************************************************************/

/*
 * 把一個0-1串進行交換,計算最少交換次數
 */

#include<stdio.h>
#include<string.h>

const char arr[]="0001010101";

int main(void)
{
    int len = strlen(arr);
    int i,j;
    int count = 0;

    for(i=0,j=len-1;i<j;i++,j--)
    {
        for(;(i<j)&&(arr[i] == '0');i++)
        for(;(i<j)&&(arr[i] == '1');j--);
        if(i<j)
        {
            count++;
        }
    }

    printf("%d\n",count);

    return 0;
}

未完待續

反饋與建議

相關推薦

2016 C語言試題——字串函式實現

2016 C語言面試題——字串函式 前言:最近準備找工作了,所以需要做一些準備。先從基本的字串函式的實現開始。如果有發現什麼問題或有什麼疑惑,請及時評論。 strcat /************

C語言 不使用strcpy 函式實現字串複製功能

#include<stdio.h> void Copy_string(char* str1, char* str2);   //函式宣告 int main() {     char str1[20];     char str2[20];     puts("請輸入字串str1:");   

C語言中返回字串函式的四種實現方法

其實就是要返回一個有效的指標,尾部變數退出後就無效了。 使用分配的記憶體,地址是有效 char   *fun() {         char*   s   =   (char*)calloc(100,   sizeof(char*)   );         if   (s)                

C語言試題:查詢字串中第一個不重複的字元

char findChar(char *s) { char *p,*q; p=q=s; while(*s != '\0') { while(*p++ != '\0')

C語言試題分類->排序算法

OS sort 試題 時間復雜度 ups popup popu 使用 body 1.選擇排序。   每次將最小的數,與剩余數做比較。找到更小的,做交換。   時間復雜度:O(n2)   空間復雜度:O(1)   優缺點:耗時但內存空間使用小。 void selectSor

C語言試題分類->回調

指向 name 傳輸 join 接口 但是 PE AS 一個數 本文主要講解如果實現回調,特別是在封裝接口的時候,回調顯得特別重要,我們首先假設有兩個程序員在寫代碼,A程序員寫底層驅動接口,B程序員寫上層應用程序,然而此時底層驅動接口A有一個數據d需要傳輸給B,此時有兩種方

智郵普創c語言試題 ---- 字母概率

arr apple void != stdio.h app words 遊戲 包含 題目描述 小明最近對概率問題很感興趣。一天,小明和小紅一起玩一個概率遊戲,首先小明給出一個字母和一個單詞,然後由小紅計算這個字母在這個單詞中出現的概率。字母不區分大小寫。 例如,給定的字母是

C語言:如何用函式實現2-100以內素數的判別

C語言中如何用函式實現2-100以內素數的判別 #include<stdio.h> #include<math.h> int isPrime(int);//函式宣告 int main() { int i; for(i = 2; i <= 100;

C語言試題---指標篇(三)

版本宣告:本文轉載於公眾號TeachPlus C語言面試題---指標篇(三) 了解了記憶體空間,接下來我們就一起看一下指標自身用法的一些題目,先來看這樣一道題目: 分析下面程式碼:` # include <stdio.h> # include

C語言試題---指標篇(一)

版本宣告:本文轉載於公眾號TeachPlus 指標的使用,一直是c語言面試題中必考的部分, 因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合, 因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤:

C語言試題2

1 預處理 問題1:什麼是預編譯?何時需要預編譯? 答: 預編譯又稱預處理,是整個編譯過程最先做的工作,即程式執行前的一些預處理工作。主要處理#開頭的指令。如拷貝#include包含的檔案程式碼、替換#define定義的巨集、條件編譯#if等。. 何時需要預編譯: 1、總是使用不經常改動的

軟體素材---linux C語言:拼接字串函式 strcat的用例(與char陣列聯合使用挺好)

【標頭檔案】#include <string.h> 【原型】 1 char *strcat(char *dest, const char *src); 【引數】: dest 為目標字串指標,src 為源字串指標。

C語言試題---指標篇(二)

# include <stdio.h># include <stdlib.h># include <string.h>void getMemory( char **p , int num){ *p = malloc(num);} int main() {

100道c語言試題

題目來源: 1、中興、華為、慧通、英華達、微軟亞洲技術中心等中 外企業面試題目; 2、C 語言面試寶典(林銳《高質量程式設計第三版》)。 說明: 1、部分C 語言面試題中可能會參雜部分和C++ 相關的知 識,為了保持題目的靈活性故保留,但選題最終還是 會以C

C語言試題大彙總 (影象處理方向)

1、區域性變數能否和全域性變數重名?    答:能,區域性會遮蔽全域性。要用全域性變數,需要使用"::" ;區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同一個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義一個同名的

C語言下使用iconv函式實現字元編碼轉換

1.iconv相關函式介紹 iconv命令是用來轉換檔案的編碼方式的(Convert encoding of given files from one encoding to another),比如它可以將UTF8編碼的轉換成GB18030的編碼,反過來也行。一般linux下包含iconv指令: 格式:ico

C語言試題

關於“一年有多少秒”的巨集定義 網上關於這個問題的答案都是(365*24*60*60)UL,是錯誤的。 正解:數字和型別是一個整體,()是外人。 #include <stdio.h> #define SECONDS_PER_YEAR (3

9道常見C語言試題

1、區域性變數能否和全域性變數重名?      答:能,區域性會遮蔽全域性。要用全域性變數,需要使用"::" ;區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同一個函式內可以定義多個同

12個有趣的C語言試題(中英文對照)

In this article, we will discuss some interesting problems on C language that can help students to brush up their C programming skills

C語言試題 4 (查詢整數陣列中第二大的數)

題目:寫一個函式找出一個整數陣列中,第二大的數。【Mirosoft】 PS:1、” 66,66,66,66,66 ”,則沒有第二大數。 2、” 99,99,88,86,68,66 ”,則最大數是88。 下面我先給出查詢最大數字的程式: int GetFirstMaxNumbe