判断char*里是否包含某子字符串,取char*部分字符串存储的问题

xveseyanling 2008-02-29 10:29:39
char* a_cpTest = "[HEAD]{{filename=xxx.txt},{filesize=123456}}[LIST:FILES]{{filename=YYY.txt},{filesize=123456}};{{filename=xxx.txt},{filesize=123456}}";

char temp1[256];
char temp2[256];

请问我如何判断a_cpTest里是否包含filename字符串?是用strstr()?
如果要把a_cpTest里面第一个filename后面=后面的文件名xxx.txt存到temp1里面,
把第二个filename后面的YYY.txt存到temp2里面,该怎么实现?
谢谢!
...全文
2228 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-02-29
  • 打赏
  • 举报
回复
char *p1, *p2;
p2 = a_cpTest;

while(TRUE)
{
p1 = strstr(p2, "{filename=");
if (p1 = NULL) break;
p2 = strchr(p1, '}');
memcpy(...
}
Supper_Jerry 2008-02-29
  • 打赏
  • 举报
回复
气死我了。。
Supper_Jerry 2008-02-29
  • 打赏
  • 举报
回复
慢了。。就调试了一会,被人抢了。。。唉
我的可以直接运行,结果争取的。
Supper_Jerry 2008-02-29
  • 打赏
  • 举报
回复
void main()
{
char temp2[256] = {0};
char* a_cpTest = "[HEAD]{{filename=xxx.txt},{filesize=123456}}[LIST:FILES]{{filename=YYY.txt},{filesize=123456}};{{filename=xxx.txt},{filesize=123456}}";
char* p = a_cpTest;
int count(0);
while(1)
{
p = strstr(p, "filename=");
if(p)
{
char* pIn = strchr(p, '=');
if(pIn)
{
char *pO = strchr(pIn+1, '}');
if(pO)
{
if(count == 0)
{
memcpy(temp1, pIn + 1, pO - pIn - 1);
count ++;
p = pO;
}
else
{
memcpy(temp2, pIn + 1, pO - pIn - 1);
count ++;
break;
}
}
}
}
}
}
ryfdizuo 2008-02-29
  • 打赏
  • 举报
回复
找到filename的位置以后,就可以和快的读取出=后面的文件名了,
xveseyanling 2008-02-29
  • 打赏
  • 举报
回复
谢谢您了!
万分感谢!
ryfdizuo 2008-02-29
  • 打赏
  • 举报
回复

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

int main(int argc, char *argv[])
{
char* a_cpTest="[HEAD]{{filename=xxx.txt},{}filesize=123456}}[LIST:FILES]{{filename=YYY.txt},";
char* str="filename";
char temp1[256];
char temp2[256];

char *pdest1, *pdest2;
int result1, result2;
printf( "String to be searched:\n\t%s\n", a_cpTest );

pdest1 = strstr( a_cpTest, str );
result1 = pdest1 - a_cpTest + 1;
if( pdest1 != NULL )
printf( "%s found at position %d\n\n", str, result1 );
else
printf( "%s not found\n", str );

pdest2 = strstr( a_cpTest+result1, str );
result2 = pdest2 - a_cpTest + 1;
if( pdest2 != NULL )
printf( "%s found at position %d\n\n", str, result2 );
else
printf( "%s not found\n", str );

return 0;
}
xveseyanling 2008-02-29
  • 打赏
  • 举报
回复
楼上的达人
这个循环怎么循环到下一个filename?
该怎么写啊?谢谢!
shaoze5 2008-02-29
  • 打赏
  • 举报
回复
int strcspn(char *str1, char *str2);
char *strstr(char *str1, char *str2);
利用两个函数的返回值,循环处理,就可以了吧。
wenjun1130 2008-02-29
  • 打赏
  • 举报
回复
用strcmp();从第9个字符开始比较,
取xxx.txt,用循环,取第一个‘=’和‘.’之间的部分存到temp变量中
面试题,是纸上写的,发现了些错误,回来改进了下。写纸上和写计算机并编译成功完全是两个效果。 开始没太多字符串操作,很繁琐、难点也多,后逐渐改进。 典型问题1: sizeof()局限于栈数组 char a[] = "asd213123123"; 形式,并且这种不能用'\0'判断是否结束(这种判断方式能很方便加在while条件中用于判断越界——b != '\0')。 如果是字符串常量: char *b = "dasadafasdf"; 这种情况,sizeof()就废掉了! 总之: 对号入座,前者sizeof、后者strlen~!不过sizeof(a)和strlen(b)还有另外一个区别,strlen不计算'\0',而sizeof要计算(前提是sizeof()不针对char指针) 典型问题2: 用什么来暂存并输出结果?还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i 对应的长度(counter[i])都有了。 这是针对不知道字符串大小并且不占用额外空间的做法,需要非常繁琐的操作,要加很多标记,越界判断也会有些麻烦(结合优势么,用字符串常量而不是栈空间中的字符数组,有'\0'——就好判断了!) (关于空间的占用,如果要用一个和字符串a一样长的数组counter来计录a中各起点对应与b最大重合子字符串,这个数组也要和a一样长,空间上也不合适,除非情形很特殊,a短b长,不然不如直接malloc()一个堆空间来储存当前最长“子字符串”,并实时更新) 先放一个改完编译测试成功的。 release1 //题目:要求比较A字符串(例如“abcdef"),B字符串(例如(bdcda)。找出重合度最大的子字符串,输出(根据OJ经验,输>出结果对即可) #include #include #include main(){ char *A = "abcderfghi"; char *B = "aderkkkkkabcd"; int i,j,c = 0,count = 0; unsigned int maxSeg = 0; int max = strlen(A) > strlen(B) ? strlen(A) : strlen(B); char* final = (char*)malloc(sizeof(char) * (max + 1)); final[max] = '\0'; for(i = 0;A[i] != '\0';i++){ for(j = 0;B[j] != '\0';j++){ while(A[i + c] == B[j] && A[i+c] != '\0' && B[j] != '\0'){ count++; c++; j++; }                         if(count > maxSeg){                                 strncpy(final,(A + i),count);                                 maxSeg = count;                         } count = 0; c = 0; } } printf("%s\n",final); free(final); } 这是能将就用的第一个版本~!关于结束符'\0'能否影响free()的使用,觉得是完全不用操心的,因为malloc的大小是系统来保存的,删除时候系统来接手就完了,而'\0'结束符只是针对一些常规字符串操作,比如printf()用%s控制输出时~! 新难点:找到的子字符串同时一样长怎么办?那我这只能叫做”第一个最长的重合字符串“用两块空间来存储?三段等长怎么办? 如: "abclbcdlcdel" "kabckbcdkcde" abc长3,bcd长3,cde长3。。。 未完成版本1:这段是错误示范,初期定位模糊思路乱,有些函数和功能不把握,又在纸上写。 思路乱的一个后果就是前期想用i和j简单判断越界问题,后期又弄了i+c之类的下标, 修改思路: 把字符串换成“字符串常量”——带'\0'的,这样在小while中用 != '\0'就能判断出界问题。 把字符串变成字符串常量以后的另一个问题是sizeof不能用了,引入string.h,用strlen()替代即可。 //题目:要求比较A字符串(例如“abcdef"),B字符串(例如(bdcda)。找出重合度最大的子字符串,输出(根据OJ经验,输出结果对即可) //遗忘,未使用string.h相关函数。 #include main(){ char A[] = "asdasd"; char B[] = "asdasd"; /*本版本处理方式为最通用的针对字符串大小未知情况的遍历——比如“字符串常量”——此时可用strlen()代替sizeof(),并引入即可。 *但是因在纸上做题,在条件上做了简化————使用了sizeof()可确定大小的字符数组而非“字符串常量”。具体用sizeof()还是strlen()。这些小问题请读者自行区分。 *如果可用sizeof()确定大小,就可以用malloc()创建一个临时字符串存储并输出最大字符子段,代码会简化很多~! *不过如果用malloc()保存最大子段,随着最大子段变化,需要不停的free()再重新malloc(),要注意 */ int i,j,flag,c = 0,temp = 0,max = 0,count[sizeof(A)]; for(i = 0;i < sizeof(A);i++){//以i为A中“子字符串”首位,遍历B,看B中与A[i]起的子字符串最大匹配数量是多少,记为count[i],每个count[i]对应A中一个字符 for(j = 0;j count[i])//找出B中匹配度最高子段,不用记录下标,只需记录匹配的字符数量,A[i]是固定的起点,加上偏移量,就是这段 count[i] = temp; } //清零,准备面对新的起点j~!以j为起点再找匹配的一段字符串 //j不用恢复~!恢复原样的话,算上j++是移动了一位,不会死循环~!但是,因为这一段本来就是连续的,abcd都连续了,bcd和cd不用看了。 temp = 0; c = 0; } } //比较count数组,看哪个i对应子段越大 //temp = 0;//节省空间的考虑(虽然只有4B),怕不适应就改叫max,去声明一个max变量。 for(i = 0;i max){//找出最大的一个计数器~~~~并记录i!!! max = count[i];//这句可以精简掉,可能?不可以,作为“下标”可以被精简,因为有了flag~!但作为max不能少,做比较用——叫max比较好理解。 flag = i;//用flag记录相应最大子段的起始偏移量 } //输出该子段 for(i = flag;i < flag + count[flag];i++){//temp来源于前一个for循环,意为最大偏移量。 printf("%c",A[i]); } printf("\n"); } ———————————————— 版权声明:本文为CSDN博主「秦伟H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/huqinwei987/article/details/25316699

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧