首页 > 代码库 > 【实习记】2014-08-14新版本的apache已默认不支持cgi+C语言中的scanf未解之迷
【实习记】2014-08-14新版本的apache已默认不支持cgi+C语言中的scanf未解之迷
总结1:
ubuntu14.04上的apache2.4.7默认没有cgi模块,而ubuntu10.04是的apache2.2.14默认是有的。
起因:每次都用ubuntu14.04上的VBox里运行的ubuntu10.04上的apache2,感觉略麻烦,于是直接在ubuntu14.04上装个apache2。
发现/cgi-bin/里的cgi总是404,反复确认配置目录没错。
怀疑权限问题(但一般会是5XX而不是404),最后无果。
搜索多次,资料不多,最后找到线索和答案,就是默认不支持了,对于开源软件版本差异巨大问题已见惯不怪,诶,官网没有特别说明。
解决方法:《编译支持cgi的apache》http://www.icycandy.com/blog/compile-cgi-support-for-apache
引用:“在configure时加一个选项–enable-cgi来打开apache的cgi支持”
我打算先用着ubuntu10.04。
晚上以为顺利:谁知又有阻碍。
总结2:
C语言中的scanf未解之迷:最后一个赋值的变量无缘无故多了个分割符。
#include <stdio.h>int main(int argc, char* argv[]){ /* 输出如下其中a,1,b,c是输入 * login,1,rich,rich, * login;1;rich;rich; * login#1#rich#rich# * a,1,b,c * login,1,rich#rich, */ int type=0; char name[32]="\0", password[32]="\0"; sscanf("login,1,rich,rich", "login,%d,%s,%s", &type, name, password); printf("login,%d,%s,%s\n", type, name, password); /* login,1,rich,rich, */ sscanf( "login;1;rich;rich", "login;%d;%s;%s", &type, name, password); printf("login;%d;%s;%s\n", type, name, password); /* login;1;rich;rich; */ sscanf( "login#1#rich#rich", "login#%d#%s#%s", &type, name, password); printf("login#%d#%s#%s\n", type, name, password); /* login#1#rich#rich# */ scanf("login,%d,%s,%s", &type, name, password); printf("login,%d,%s,%s\n", type, name, password); /* 末尾总是多一个分割符 */ return 0;}
许久后才想明白,%s会读取字符,只认空格,制表符做分割;于是%s#%s中的第一个%s把rich#rich读完了!
可是输出的最后一行也是很恐怖的错误!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。