这里着重谈及字符串的 子串内容,而非子序列。
一、关于字符串的分割
//
//字符串分割
//
#pragma once
#ifndef Programming_Experience_StringSegmentation_H
#define Programming_Experience_StringSegmentation_H
#include <cstdio>
#include <cstring>
void StringSegmented(char str[], char delim[]) {
// 函数原型 char* strtok(char* s,const char* delim)
// 当s串不为空时,分割起点为该串首地址;当s串为空串 NULL 时,切割起点为上次 分割符 标记了的下一个索引位置
// 函数只是把分割符依次全都置换成 回车符'\n'
int i = 1;
for (char* sub = strtok(str, delim); sub != NULL; sub = strtok(NULL, delim)) {
printf("subS%d = \"%s\"\n",i++, sub);
}
putchar('\n');
}
//验证原理
void StringSegmentedⅡ(char str[], char delim[]) {
int len = strlen(str);
typedef char* charIP;
charIP startIP = str, endIP = str+len;
//注意对 endIP 的定义, 用户若是规定其为数组的最后一位元素的索引,则初始化为 str+len-1 或者写成 &str[len-1]
//常见的规定是:作为数组的最后一位元素的下一个位置,则初始化为 str+len 或 &str[len]。(如 迭代器)
for (int i = 0; i < len; ++i) {
printf("str[%d] %p %c\t", i, &str[i], str[i]);
}
putchar('\n');
putchar('\n');
int i = 1;
for (char* sub = strtok(str, delim); sub != NULL; sub = strtok(NULL, delim)) {
printf("str = %s\tsub = %s\n", str, sub); //原始母串s会被修改,且有且仅有一次修改,变为最前的第一个字串
}
putchar('\n');
putchar('\n');
for (charIP ip = startIP; ip != endIP; ++ip) {
if(NULL==*ip) printf("%p %s\t", ip,"\\n");