摘自百度知道的一个问题
比如说我要截取http://img.baidu.com/img/logo-zhidao.gif中的我
logo-zhidao.gif文件名称当然次url可以是任意的就像迅雷的下载的一样他会自动把文件名提取出来也就是最后一个反斜杠后面的内容。要写成一个函数的形式可以调用!要输出的是字符串%s的形式!
思路大概如下:将整个字符串及其长度传给函数,然后在函数中用指针接收字符串,利用其长度把指针移到字符串结尾处,然后用循环不断将指针向前移动,并判断其指向的字符与/是不是一样的,如果一样退出循环,此时指针指向着字符串中最后一个/
的前一个字符, 因此最后将指针再向前移2位到/后面的一个字符,最后反回指针, 再输出返回的指针后面的内容就是名称了
回答一
函数声明:char* GetName(char*,int);
整个程序:
#include
char* GetName(char*,int);
int main(void)
{
char str[] = "http://img.baidu.com/img/logo-zhidao.gif";
char *name;
int n;
n =
sizeof(str); //计算字符串的长度(包括'\0')
name = GetName(str,n); //把字符串及其长度传给函数
printf("%s\n",name); //name就是那个名称,可以输出
return 0;
}
char* GetName(char*ptr,int n)
{
int i =
n; //这里i只是为循环即使终止了也未找到/而准备
ptr+=n; //把指针移到字符串的尾部,即'\0'处
while(i-->0)
{
if((*ptr--) == '/') //指针不断回移并判断是否为/符号
{
break; //从后向前遇到第一个/后退出循环
}
}
ptr+=2; return ptr; //反回最后一个/后面的字符串即名称
}
函数原型:
char* GetName(char*ptr,int n)
{
int i = n;
ptr+=n;
while(i-->0)
{
if((*ptr--) == '/')
{
break;
}
}
ptr+=2;
return ptr;
}
回答二
用for从后往前取,每拿一个字符就写入数组,遇见/后中止读取,这时候翻转缓冲区就能得到文件名
void AddChar(char *buf, char ch)
{
char a[2]={0};
a[0]=ch;
strcat(buf,a);
}
char *GetFileName(char *url)
{
char tmp, buf[256]={0}, RetVal[256]={0};
//取反文件名
for(int i=strlen(buf); *(url+i)!='/'; i--)
{
AddChar(buf,
*(url+i));
}
//翻转文件名
for(int i=strlen(buf), j=0; *(url+i)!=0;
i--,j++)
{
RetVal[j] =
*(url+i);
}
return RetVal;
}
每当在百度知道看到好的回答的时候,就感觉心潮澎湃
呵呵,我想这些正真为网友解决问题的人才是我们正真需要的人,他们回答问题,是本着对网友负责的态度,其实也是对自己负责的态度。不图名,不图利。只为能帮助需要帮助的人。我曾经和我的一个朋友说过,其实,在生活中,存在着很多锻炼自己能力的机会,是我们自己的懒惰,是我们自己的不负责任,使机会一次一次的离我们而去,那些真正为网友解决问题的人,他们不仅锻炼了自己的能力,而且还帮助了别人,一举两得,他们真正做到了对自己负责。如果你只是想在百度知道混分的话,我劝你还是停止吧,你是在浪费时间和精力。一些拙见,自勉。呵呵。