【发布时间】:2015-08-11 06:08:44
【问题描述】:
我正在开发一个 apache 模块,该模块将斜杠组转换为单斜杠,以避免网站上出现重复的内容。我遇到的问题是 strcat 函数似乎没有做任何事情。我正在尝试使用它们将“http://example.com”添加到结果 URL 中,以便用户重定向到,如果它最初包含 2 个或更多斜线组合在一起的组。
static int handler(request_rec *r){
if (strcmp(r->handler,"httpd/unix-directory")==0){return DECLINED;}
unsigned long flag=0,ct=0;
char xi[100004],*xuri=xi,*up=r->unparsed_uri;
*xuri='\0';
strcat(xuri,"http://");
strcat(xuri,r->hostname);
while (*up != '\0'){
if (*up=='/'){flag++;}else{flag=0;}
if (flag < 2){*xuri=*up;xuri++;ct++;if (ct >= 100000){break;}}
if (flag > 1){flag=2;}
up++;
}
if (ct < 100000){
if (ct > 0){xuri--;}
if (*xuri=='/'){*xuri='\0';}
xuri++;*xuri='\0';
xuri=xi;up=r->unparsed_uri;
if (strcmp(up,xuri)==0){return DECLINED;} //no redirect for same URL
r->content_type = "text/html";
apr_table_set(r->headers_out,"Location",xuri);
return HTTP_MOVED_PERMANENTLY;
}else{
return HTTP_INTERNAL_SERVER_ERROR;
}
}
目前读取任何 URL 的尾部(例如,来自 http://example.com/123 的 /123 部分)并且只输出尾部,但我希望在前面加上 http://example.com/ 部分。
我能做些什么来让 strcat 对我有利?
【问题讨论】:
-
我确信
strcat函数工作得很好,但是你做了一些其他的事情让你认为它没有。尝试在调试器中运行,并逐行逐行检查代码以查看 真正 发生了什么(但我建议您添加更多换行符,这顺便会使您的代码更具可读性)。 -
请帮助我们,告诉我们您在代码中的哪个位置检查 strcat 输出并确定它是错误的。 AFAICS 你的代码在
strcat完成工作后更改xuri。那么您如何确定是strcat不起作用(我对此表示怀疑)而不是您的后续代码弄乱了缓冲区? -
也许 strcat 真的不推进 xuri 指针?我以为有?在我的 while 循环中,xuri 只有在当前位置设置了值时才会前进。
-
@Mike:
strcat怎么可能推进一个 按值 传递给strcat的指针?strcat即使它愿意也无法推进它。strcat的实现无权访问xuri。它只能访问xuri的副本。 -
我一开始以为会这样,因为如果一个人发出多个 strcat 语句,你会认为数据被添加到字符串中,然后我想可能每次添加数据时指针都会更新。