【问题标题】:strcat not prepending strings in Cstrcat 没有在 C 中添加字符串
【发布时间】: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 语句,你会认为数据被添加到字符串中,然后我想可能每次添加数据时指针都会更新。

标签: c string prepend strcat


【解决方案1】:

strcat 不会更新 xuri。所以xuri 在两次调用strcat 之后仍然指向字符串的开头。因此,当代码到达语句*xuri=*up;xuri++; 时,它会从头开始覆盖字符串。

您可以改用sprintf 来解决此问题,因为这允许您适当地更新xuri,例如替换这三行

*xuri='\0';
strcat(xuri,"http://");
strcat(xuri,r->hostname);

用这条线

xuri += sprintf( "http://%s", r->hostname );

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 2017-01-24
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多