C语言实现substr函数
在C语言中,我们可以自己实现一个类似其他语言中substr的函数,用于从字符串中提取一个子字符串,以下是几种实现方式:

(图片来源网络,侵删)
方法1:使用标准库函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* substr(const char* str, int start, int length) {
if (str == NULL || start < 0 || length < 0) {
return NULL;
}
int str_len = strlen(str);
if (start >= str_len) {
return NULL;
}
if (start + length > str_len) {
length = str_len - start;
}
char* result = (char*)malloc(length + 1);
if (result == NULL) {
return NULL;
}
memcpy(result, str + start, length);
result[length] = '\0';
return result;
}
int main() {
const char* str = "Hello, World!";
char* sub = substr(str, 7, 5);
if (sub != NULL) {
printf("Original: %s\n", str);
printf("Substring: %s\n", sub);
free(sub);
}
return 0;
}
方法2:不使用标准库函数
#include <stdio.h>
#include <stdlib.h>
char* substr(const char* str, int start, int length) {
if (str == NULL || start < 0 || length < 0) {
return NULL;
}
// 计算字符串长度
int str_len = 0;
while (str[str_len] != '\0') {
str_len++;
}
if (start >= str_len) {
return NULL;
}
if (start + length > str_len) {
length = str_len - start;
}
char* result = (char*)malloc(length + 1);
if (result == NULL) {
return NULL;
}
for (int i = 0; i < length; i++) {
result[i] = str[start + i];
}
result[length] = '\0';
return result;
}
int main() {
const char* str = "Hello, World!";
char* sub = substr(str, 7, 5);
if (sub != NULL) {
printf("Original: %s\n", str);
printf("Substring: %s\n", sub);
free(sub);
}
return 0;
}
方法3:直接修改原字符串(不推荐)
这种方法会直接修改原字符串,通常不推荐使用,因为它会改变原始数据:
#include <stdio.h>
#include <string.h>
void substr_inplace(char* str, int start, int length) {
if (str == NULL || start < 0 || length < 0) {
return;
}
int str_len = strlen(str);
if (start >= str_len) {
str[0] = '\0';
return;
}
if (start + length > str_len) {
length = str_len - start;
}
// 移动子字符串到开头
memmove(str, str + start, length);
str[length] = '\0';
}
int main() {
char str[] = "Hello, World!";
printf("Original: %s\n", str);
substr_inplace(str, 7, 5);
printf("Modified: %s\n", str);
return 0;
}
注意事项
- 内存管理:前两种方法分配了内存,调用者需要负责释放内存
- 边界检查:确保start和length在有效范围内
- 字符串长度:确保不会越界访问
- NULL指针:处理输入字符串为NULL的情况
选择哪种方法取决于你的具体需求,如果需要保留原字符串,使用方法1或2;如果可以修改原字符串,方法3也可以使用但不推荐。

(图片来源网络,侵删)
