1. 程式人生 > >C語言中常用的字串操作(子串分割、替換、去前後空格、遞迴實現字串反轉)

C語言中常用的字串操作(子串分割、替換、去前後空格、遞迴實現字串反轉)

在C語言中,並沒有像java中對字串操作的封裝好的函式,在C語言中,都需要自己根據C語言函式庫來實現常用的字串操作

一、字串的分割,根據子串進行分割

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

//字串的分割,根據子串分割字串
//引數:
//str被分割的字串
//sub子串
//sub_before為str中sub所在位置的之前部分
//sub_after為str中sub所在位置的之後部分,包括sub
void str_split(const char* str/*in*/,char* sub/*in*/,char** sub_before/*out*/,char** sub_after/*out*/){
	if ( str == NULL || *str=='\0' || sub==NULL){
		printf("function str_split error:( str == NULL || *str=='\0' || sub==NULL)");
		return;
	}
	if (*sub_before == NULL){
		*sub_before = (char*)malloc(strlen(str));
	}
	if (*sub_after == NULL){
		*sub_after = (char*)malloc(strlen(str));
	}
	//分割字串的時候使用strstr函式,返回是第一個sub地址,如果沒有匹配的則返回NULL
	char* temp = (char*)malloc(strlen(str));
	strcpy(temp,str);
	*sub_after = strstr(temp, sub);
	//沒有匹配的子串
	if (*sub_after == NULL || **sub_after == '\0'){
		printf("the str without sub");
		return;
	}
	//新增結束標誌符
	*(*sub_after + strlen(*sub_after)) = '\0';
	//將字串中sub之前的字元賦值給sub_before
	int i = 0;
	while (i < (strlen(temp)-strlen(*sub_after))){
		*(*sub_before + i) = *(temp+i);
		i++;
	}
	//新增結束標誌符,新增結束標誌的目的是為了防止亂碼
	*(*sub_before + i) = '\0';
}

二、去字串的前後空格
//傳入一個字串,去除字串前後的空格
//引數:
//str為需要去除空格的字串
//newchar為去除空格之後的字串
void trim_space(const char* str/*in*/,char* newchar/*out*/){
	if (str == NULL || *str == '\0' || newchar == NULL){
		printf("function trim_space error:(str==NULL || *str=='\0' || newchar == NULL)");
		return;
	}
	//利用左右開弓來去除前後的空格
	int i = 0, j = strlen(str);
	//isspace函式是用來判斷字元是否為空格
	//求出,在str字串前面有多少個空格
	while (isspace(str[i]) || str[i]=='\0')
	{
		i++;
	}
	//求出,在str字串後面有多少個空格
	while (isspace(str[j]) || str[j]=='\0'){
		j++;
	}
	//從str+i個位置開始將(j-i+1)個字元拷貝到newchar中
	strncpy(newchar,str+i,j-i+1);
}
三、遞迴實現字串的反轉
//通過函式的遞迴呼叫來實現字串的反轉
//引數:
//str:需要反轉的字串
//inverse_str:反轉之後的字串
void str_inverse(const char* str/*in*/,char* inverse_str/*out*/){
	//遇到異常情況,直接跳出方法
	if (str == NULL || inverse_str==NULL){
		printf("function str_inverse error:(str == NULL || inverse_str==NULL)");
		return;
	}
	//遞迴的結束,當到str字串結束的時候
	if (*str == '\0'){
		return;
	}
	str_inverse(str+1,inverse_str);
	strncat(inverse_str,str,1);
}
void main(){//呼叫字串反轉
	char* s = "abcdefg";
	//char result[10] = {0};//這種方式可以呼叫成功
	//char* result = (char*)malloc(strlen(s));//這種會宕機(出現異常),原因是因為malloc函式不會初始化導致,因為開闢空間的時候只開闢了
//那麼多,而後面使用strcat函式進行拼接,是直接在以前的基礎上進行拼接,會出現,前面亂碼,但是結果還是正確的
	char* result = (char*)calloc(strlen(s),1);
	str_inverse(s,result);
	cout << result << endl;
}

四、字串的替換(下面的函式使用到了上面的字串分割函式str_split)
//字串的替換
//引數:
//str:原字串
//replace_str:要被替換的字串
//replace_become:要替換成什麼字串
//replace_after:替換之後的字串
void str_replace(const char* str/*in*/,char* replace_str/*in*/,char* replace_become/*in*/,char** replace_after/*out*/){
	//遇到異常情況直接退出
	if (str == NULL || *str == '\0' || replace_str == NULL || replace_str == '\0' || replace_become == NULL || *replace_become=='\0'){
		printf("function str_replace error:(str==NULL || *str =='\0' || replace_str==NULL || replace_str=='\0')");
		return;
	}
	const char* flag = strstr(str,replace_str);
	//字串str中沒有子串
	if (flag==NULL){
		printf("the str without replace_str");
		return;
	}
	//為結果開闢空間
	*replace_after = (char*)calloc(strlen(str)+strlen(replace_become)-strlen(replace_str),1);
	//通過字串的分割之後進行拼接
	char *after = NULL, *before=NULL;
	while (flag){
		if (after == NULL){
			str_split(str, replace_str, &before, &after);
		}
		else{
			str_split(after, replace_str, &before, &after);
		}
		strcat(*replace_after,before);
		strcat(*replace_after,replace_become);
		after = after + strlen(replace_str);
		flag = strstr(after,replace_str);
	}
	if (after != '\0'){
		strcat(*replace_after,after);
	}
}
要想掌握好c語言中的指標,多做一下c語言中的字串操作是最好的辦法。