面試:字符串相關(一)

      這裏是面試常見的字符串相關題目。

      該文章主要將strcpy、memcpy、memmove三個。

1. strcpy

          strcpy的返回值是目的字符串的地址,可以實現鏈式語法。

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

char *mystrcpy(char *dst, char *src)
{
    char *res = dst;
    if (!src || !dst) return dst;
    while ((*(dst++) = *(src++)) != '\0');
    return res;
}

int main()
{
    char *a1 = (char*)malloc(5);
    char a[] = "12345678";
    char b[] = "1234111111111";
    mystrcpy(a, b);
    printf("%s\n", a);          // 輸出 1234111111111
    mystrcpy(a1, b);
    printf("%s\n", a1);          // 輸出 1234111111111
    free(a1);
    return 0;
}

            另外,這裏是因爲字符串都是顯式所以編譯器能夠特殊處理嗎?居然沒有出現內存溢出的問題。

2. memcpy

           注意memcpy是直接賦值內存的內容的,所以返回值及輸入都是void指針類型,需要制定賦值的數量。

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

void *mymemcpy(void *dst, void *src, int count)
{
    assert(dst != NULL && src != NULL);
    char *tmp_src = (char *)src;
    char *tmp_dst = (char *)dst;
    while (count--) {
        *(tmp_dst++) = *(tmp_src++);
    }
    return dst;
}

int main()
{
    char a[] = "12345678";
    char b[] = "qweer";
    mymemcpy(b, a, 2);
    printf("%s\n", b);     //輸出 12eer
    return 0;
}

3. memmove

          memmove與memcpy不一樣的地方就是memmove會考慮目標區域與來源區域存在重疊的情況。那麼如果目標區域在來源區域的前面,則從頭一個一個賦值。如果目標區域在來源區域的後面,則從尾開始一個一個賦值。這樣子就可以防止賦值過去的值將還未複製的值覆蓋的情況了。

#include <stdio.h>
#include <string.h>
void *mymemmove(void *dst, void *src, int count)
{
    if (dst == NULL || src == NULL) {
        return dst;
    }
    char *tmp_dst = (char *)dst, *tmp_src = (char *)src;
    if (dst < src) {
        while (count--) {
            *(tmp_dst++) = *(tmp_src++);
        }
    }
    else if (src < dst) {
        // 注意這裏是要 - 1
        tmp_src += count - 1;
        tmp_dst += count - 1;
        while (count--) {
            *(tmp_dst--) = *(tmp_src--);
        }
    }
    return dst;
}

int main()
{
    char a[] = "123456789qwerty";
    mymemmove(a+5, a, 5);   
    printf("%s\n", a);           // 輸出 1234512345werty
    mymemmove(a, a+9, 5);
    printf("%s\n", a);           // 輸出 5wert12345werty
    return 1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章