提取任意一对分隔符之间的子字符串
分隔符是将字符串与其他字符分开的字符,例如,在我们日常阅读活动中的句子中,我们能够区分不同的单词,是因为它们被空格分隔开来。在数学和正则表达式中,我们使用()括号作为主要分隔符。
子字符串的概念及其操作在编程中非常重要,尤其是在C语言中,C语言是一种用于编写编译器和汇编器的语言。在字符串中识别分隔符,并将起始分隔符后的字符复制到另一个变量中,直到结束分隔符。
可以使用==和!=运算符来比较字符串中的字符和用户指定的界定符字符。
使用scanf()函数从用户处接受字符串,因此不允许空格作为字符串的一部分。如果使用puts()或其他函数或方法,则可以获得高级版本。
此程序使用数组和字符串处理的基本概念,不使用头文件中提供的任何字符串函数。可以使用字符串比较、字符串复制函数,但作为简单逻辑练习,此程序是用非常基本的逻辑完成的。
使用的方法
方法1:使用substring()
方法2:使用函数
两种方法各有优势。方法1是一种直接的解决方案,有助于用户理解字符串操作的过程;而方法2通过使用函数,促进了更好的软件设计原则和可维护性。
语法
在C编程语言中,提取任意一对分隔符之间的子字符串是一种常见的编程任务。提取子字符串的方法可能因具体问题要求和约束而异。然而,一种广泛使用的方法是利用C标准库中的strtok()函数。此函数用于根据指定的定界符将字符串分解成一系列标记。该函数以原始字符串和定界符作为输入,并返回指向字符串中找到的第一个标记的指针。为了提取所有子字符串,可以重复调用该函数,其第一个参数为null指针,以获得后续的标记。strtok()函数返回null指针表示字符串的结尾。
char *strtok(char *str, const char *delim);
算法
步骤1 - 声明str1、str2、delim1、delim2,初始化为null。
步骤2 - 声明整数变量len、n、I、subs
步骤3 - 从控制台接受str1、delim1和delim2
步骤4 - 检查并存储长度到len中
步骤5 - 当n<输入字符串长度len时,检查str1[n] == delim1
步骤6 - 如果是,则subs=n,中断循环
步骤7 - 当str1[subs] != delim2时,使n=0
步骤8 - 将delim1之后的str1复制到str2,str2[n] = str1[subs],递增n和subs
步骤9 - 打印str2,其中包含输入字符串减去()。
方法1:使用substring()
字符串数组操作的简单分步实现具有几个优点。它简单易懂,这对初学者或学习编程的人来说非常有益。这种方法允许用户看到程序操作字符串的确切过程。但是,如前所述,这种方法有一些局限性,例如不接受包含空格的字符串并将长度限制为20个字符。使用gets方法可以克服字符串大小的限制,但值得注意的是,由于潜在的缓冲区溢出和安全风险,gets方法已被弃用。
示例
此代码构成一个软件,它根据两个分隔符提取字符串的一部分。第一个分隔符指定子字符串的开头,第二个分隔符指定子字符串的结尾。输入字符串存储在str1变量中,两个分隔符定义为delim1和delim2变量。提取的子字符串保存在str2变量中。程序首先使用第一个分隔符识别子字符串的起始位置,然后通过计算从起始位置到第二个分隔符定义的结束位置的字符数来计算其长度。然后调用Substring函数从原始字符串中提取子字符串并将其存储在str2变量中。然后在屏幕上显示提取的子字符串。
#include <stdio.h>
#include <string.h>
void Substring(char *str2, const char *str1, int start, int n) {
strncpy(str2, str1 + start, n);
}
int main() {
// Predefined input values
char str1[] = "Hello[world]!";
char delim1 = '[';
char delim2 = ']';
char str2[100];
int len1 = strlen(str1);
int start, subs, n = 0;
// Getting the position of substring based on delimiter
while (n < len1) {
if (str1[n] == delim1) {
subs = n;
break;
}
n++;
}
start = n;
// Getting the length of substring
if (str1[subs] == delim1) {
n = 0;
subs++;
while (str1[subs] != delim2) {
subs++;
n++;
}
Substring(str2, str1, start + 1, n);
}
// Adding null character at the end
str2[n] = '\0';
printf("\nSub string is %s", str2);
return 0;
}
输出
Sub string is world
方法2:函数
使用函数实现程序可以提供更模块化和组织良好的解决方案。它将代码分解成更小、可重用的部分,可以独立测试和调试。这种方法促进了更好的软件设计原则和代码可读性。通过创建函数,还可以轻松扩展程序的功能并提高其可维护性。
示例
此代码构成一个C语言软件,它提取定义字符串的一部分。字符串声明为字符数组,分隔符在主函数中预先指定。Getpos函数用于确定字符串中第一个分隔符(delim1)的位置。Copystr函数用于将两个分隔符(delim1和delim2)之间的字符复制到新的字符串中。原始字符串的长度使用string.h库中的strlen函数计算。然后使用printf函数在屏幕上显示子字符串。
#include <stdio.h>
#include <string.h>
void Getpos(char *str1, int len1, char delim1, int *subs) {
int n = 0;
while (n < len1) {
if (str1[n] == delim1) {
*subs = n;
break;
}
n++;
}
}
void Copystr(char *str1, char *str2, char delim1, char delim2, int subs) {
if (str1[subs] == delim1) {
int n = 0;
subs++;
while (str1[subs] != delim2) {
str2[n] = str1[subs];
subs++;
n++;
}
}
}
int main() {
// Predefined input values
char str1[] = "Hello[world]!";
char delim1 = '[';
char delim2 = ']';
char str2[100];
int len1, subs;
len1 = strlen(str1);
Getpos(str1, len1, delim1, &subs);
Copystr(str1, str2, delim1, delim2, subs);
str2[strlen(str2)] = '\0';
printf("\nSub string is %s", str2);
return 0;
}
输出
Sub string is world
结论
C语言中的字符串作为字符存储在内存中,其中字符串的每个字符或字母都可以单独访问和处理。字符串的数组操作使得对字符串进行各种操作变得容易,例如连接、反转、查找回文等等。这种灵活性使其在文件操作和最小内存使用方面非常有用。