关于linux下open函数的问题? 400 报错
我写一个socket传送文件程序,我先定义了一个char型buffer【100】,然后fgets(buffer,100,stdin),最后open(buffer,O_RDONLY),输入的是/mnt/hgfs/sky/a.txt,运行时,open失败,但是我直接把buffer换成"/mnt/hgfs/sky/a.txt",就打开成功了,请问第一个参数能照我这样给吗?
fgets(buffer,100,stdin);
len = strlen(buffer);
buffer[len-1] = '\0';
######fgets() 会把行尾的 '\n' 也读入,也就是说你用 fgets(buffer,100,stdin) 读入的很可能是"/mnt/hgfs/sky/a.txt\n\0" , 你可以打印出字符串所有内容确认一下是否因为这个原因导致 open() 调用失败的。
######char buffer[101]={0};######@夜游神(Lunar) : 遇到此类问题,我总是愁于不知道怎么去查证。可否透露一下查证方法? 我写程序很小心,不确定的写法一定不会写,尽管已在多个平台下试验过。######@恋恋美食 : 昨天又遇到这个问题,然后查证了下.正确说法是:在GCC和VS系列上, 如果使用了{}初始化语法,那么没在这个{}里出现的元素将被初始化为0. 所以{0}的效果是,将第一个元素赋值为0,然后再额外的将剩下所有元素赋值为0(因为未出现). 这个是编译器自己主动做的,标准好像没提.VC和GCC下是正确的. done~ : )######@夜游神(Lunar) : 谢了,以后还是用memset好了。多写行代码免去不必要的纠结,还是值得的。######@恋恋美食 : 以前争议过, 这种方式初始化,理论上只有第一个元素被置为0,后面依旧是随机的. 但传说主流编译器遇到这种初始化方式会全部置为0,以体贴广大程序员. 传说而已,我未验证过. 如果需要,最好还是memset,毕竟理论安全第一. 但是我属于效率狂+初始化懒惰者,从来不爱初始化.######我想知道这种初始化方式是不是标准的? 一直没敢用过,还用用memset初始化。######
试了一下,我查看了buffer最后一位是NULL,不行啊,还是谢谢楼上各位,期待大侠来解决
######
谢谢最后一楼,解决了
######等我以后有了分数,就给最后一楼啊版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。