很慚愧,學了這麼久別的語言,一直沒有好好學C和C++,因此如今開始認真C/C++的一些特性和比較,這裏記錄下C語言拷貝和截取的一些方式,因爲系統庫帶的函數不方便,因此本身寫了幾個工具小函數來使用。git
咱們也能夠使用 strncpy 函數或者 memcpy 方式來複制。github
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N (10) int main() { char* p1 = "abcde"; char* p2 = (char*)malloc(sizeof(char) * N); char* p3 = (char*)memcpy(p2, p1, N); printf("p2 = %s\np3 = %s\n", p2, p3); free(p2); p2 = NULL; p3 = NULL; system("pause"); return 0; }
運行結果:
p2 = abcde
p3 = abcde函數
代碼說明:
1) 代碼首先定義p1,p2,p3三個指針,但略有不一樣,p1指向一個字符串字面值,給p2分配了10個字節的內存空間。工具
2) 指針p3經過函數memcpy直接指向了指針p2所指向的內存,也就是說指針p二、p3指向了同一塊內存。而後打印p2,p3指向的內存值,結果是相同的。指針
3) 最後按照好的習慣釋放p2,並把p3也置爲NULL是爲了防止再次訪問p3指向的內存,致使野指針的發生。code
咱們也能夠本身寫一個簡單的字符串拷貝函數來進行拷貝。blog
/* 因爲 C 語言的字符串拷貝函數不是很好用,本身能夠寫一個簡單的拷貝函數 dst 爲目標地址 src 爲源字符串地址 n 爲複製的長度 */ char *copy(char *dst, char *src, int n) { char *p = src; char *q = dst; int len = strlen(src); if(n > len) n = len; while (n--) { *(q++) = *(p++); } *(q++)='\0'; // 在末尾添加上 return dst; }
咱們能夠使用 string.h
中的系統函數來進行子字符串的查找。內存
/* 字符串查找能夠使用 strstr 函數 */ char a[100] = "abcdefgh"; char b[100] = "cd"; char *p = strstr(a, b); printf("b is at a: %d\n", p-a+1);