C语言 在知道两段字符串的情况下截取中间的字符串

比如"aaa_sdfg_sss"

要把中间的sdfg取出
BYTE FindSubText(LPCSTR FullText, LPCSTR FrontText, LPCSTR BackText, LPSTR SubText)
{
if(!(*FrontText) || !(*BackText))
{
return 0;
}
LPSTR SubTextEnd = strstr(FullText, BackText);
LPSTR SubTextSet = strstr(FullText, FrontText);
if(!SubTextEnd || !SubTextSet || SubTextEnd <= SubTextSet)
{
return 0;
}

DWORD I;
for(I=0;I<(SubTextEnd - SubTextSet - strlen(FrontText));I++)
{
SubText[I] = SubTextSet[I + strlen(FrontText)];
}
SubText[I] = 0x00;
return 1;

}
自己解决了

先用strcat拼接好两个子串,然后再用left方式截取。
C语言中拼接字符串可以使用strcat函数。
1、strcat()函数 ,即string catenate的缩写
原型:extern char *strcat(char *dest,char *src);
用法:#include <string.h>
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
2、举例:

#include <stdio.h>
#include <string.h>
int main(){
char d[20]="字符串1"; //第一个字符串
char *s=" 字符串2"; //第二个字符串
strcat(d,s); //拼接两个字符串,结果保存在第一个字符串当中
printf("%s",d); //输出拼接结果:"字符串1字符串2"
getchar();
return 0;
}
3、c语言截取字符串方法:

#include <stdio.h>
#include <string.h>

/*从字符串的左边截取n个字符*/
char * left(char *dst,char *src, int n)
{
char *p = src;
char *q = dst;
int len = strlen(src);
if(n>len) n = len;
/*p += (len-n);*/ /*从右边第n个字符开始*/
while(n--) *(q++) = *(p++);
*(q++)='\0'; /*有必要吗?很有必要*/
return dst;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-01
#include <stdio.h>
#include <string.h>

char *picked(char str1[], char str2[], char separator) {
int i = 0,j = 0,flag = 0;
str2[0] = 0;
while(str1[i]) {
if(str1[i] == separator) {
flag = 1;
while(str1[i] == separator && str1[i]) ++i;
}
if(flag && str1[i]) {
while(str1[i] && str1[i] != separator)
str2[j++] = str1[i++];
str2[j] = 0;
return str2;
}
++i;
}
return str2;
}

int main() {
char s[] = "aaa_sdfg_sss";
char t[10],separator = '_';
printf("原串:%s\n",s);
printf("截取的结果:%s\n",picked(s,t,separator));
return 0;
}

追问

输入4个参数,分别是总文本,前面的文本,后面的文本,接收结果的缓存区

追答#include <stdio.h>
#include <string.h>

char *picked(char total[], char left[], char right[],char *buffer) {
int i = 0,j = 0,flag = 0;
int len = strlen(total) - strlen(left) - strlen(right);
for(i = strlen(left),j = 0; j < len; ++i,++j)
buffer[j] = total[i];
buffer[j] = 0;
return buffer;
}

int main() {
char s[] = "aaa_sdfg_sss";
char t[10],separator = '_';
printf("源串:%s\n",s);
printf("截取的结果:%s\n",picked(s,"aaa_","_sss",t));
return 0;
}

追问

要截取"a_" 和 "_s" 中间的字符串就不行了

追答#include <stdio.h>
#include <string.h>

// 返回子串t在母串s中出现时的首字符位置,不出现时返回0
int substr(char s[], char t[]) {
int i = 0,j,k,pos,flag;
while(s[i]) {
if(s[i] == t[0]) {
flag = 1;
k = pos = i + 1;
for(j = 1; t[j] && flag; ++k,++j)
flag = s[k] == t[j];
if(flag) return pos;
}
++i;
}
return 0;
}
 
char *picked(char total[], char left[], char right[],char *buffer) {
int i,j,hasleft,hasright;
    hasleft = substr(total,left);
hasright = substr(total,right);
printf("left = %d, rught = %d\n",hasleft,hasright);
if(hasleft == 0 && hasright == 0) // 前后串都没找到时,返回全部
strcpy(buffer,total);
else if(hasleft == 0) { // 只找到后串时,返回后串的前面部分
for(i = 0; i < hasright - 1; ++i)
buffer[i] = total[i];
buffer[i] = 0;
}
else if(hasright == 0) { // 只找到前串时,返回前串后面部分
for(i = hasleft + strlen(left) - 1,j = 0; total[i]; ++i,++j)
buffer[j] = total[i];
buffer[j] = 0;
}
else { // 前后串都找到时,返回两串的中间部分
for(i = hasleft + strlen(left) - 1,j = 0; i < hasright - 1; ++i,++j)
buffer[j] = total[i];
buffer[j] = 0;
}
    return buffer;
}

本回答被网友采纳
第2个回答  2015-02-04
1.调用数据库函数,查c函数库
2.string s1,s2,s3;其中s1为总字符串,s2.s3也已知
char a[100]=s1手机不好写代码,就不写完了,利用下标记录成一个新字符串
3.迭代器,find();

if
第3个回答  2015-02-05
//////////////////////////////////////////////////////////////////////////////////////////////////
修改后的程序:
#include <stdio.h>
#include "string.h"
void substr(char str[], char front[], char rear[], char *pBuffer);
void main()
{
char str[30]="aaa_sdfg_sss";//初始化
char buffer[30];//缓存区
char * pBuffer = buffer;//要想在其它函数中修改主函数中的值,必须定义指针来实现;
int i = 0;
substr("aaa_sdfg_sss", "aaa_","_sss",pBuffer);
// substr("aaa_sdfg_sss", "aa","ss",pBuffer);

while (buffer[i] != '\0')
{
printf("%c",buffer[i]);
i++;
}
printf("\n");
}
void substr(char str[], char front[], char rear[], char * pBuffer)
{

int lstr ,lfront ,lrear;
int i = 0;
char * p = str;

lstr = strlen(str);
lfront = strlen(front);
lrear = strlen(rear);

for (p = str + lfront ; p < str +lstr -lrear ; p++)
pBuffer[i++] = *p;
pBuffer[i] = '\0';
}追问

输入4个参数,分别是总文本,前面的文本,后面的文本,接收结果的缓存区

追答

substr("aaa_sdfg_sss", "aaa_","_sss",pBuffer);
这个函数的四个参数:“aaa_sdfg_sss”是总文本
“aaa_”是前面的文本
“_sss”是后面的文本
pBuffer是指向缓存区的指针
void substr(char str[], char front[], char rear[], char * pBuffer)
str:总文本
front: 前面的文本,可以是总文本前部分的任意长度字符串
rear: 后面的文本,可以是总文本后部分的任意长度字符串
pBuffer:指向缓存区的指针,用来操作缓存区
没问题吧,你看看程序,运行注释的语句看看,理解一下。

和之前写的程序对比一下,理解实现的方法有何不同。
include

void substr(char * pstr, int m, int len);
void main()
{
char str[30]="aaa_sdfg_sss";//也可以通过函数输入,这里为了说明问题操作方法,直接初始化了
char * p = str;
int m,len;
printf("取子串的其实位置m,取子串长度len\n");
//scanf("%d%d",&m,&len);
//printf("其实位置%d,取子串长度%d",m,len);
substr(p, 4,4);
}
void substr(char * pstr, int m, int len)
{
char * p = pstr;
int k = 0;
char s[30];
for(p = pstr + m; p < pstr +m +len ; p++)
s[k++] = *p;
s[k] = '\0';
k=0;
while (s[k] != '\0')
{ printf("%c",s[k]);
k++;
}
printf("\n");
}

相似回答