Re: [问题] 透过dos传0给main的argv会被当作什么

楼主: jeromeshih (以谨慎态度来面对问题)   2017-12-29 22:31:34
感谢大家的说明以及参考下面网页的内容整理一下
https://goo.gl/iB8Ha4
原本问题程式简述如下
int main(int argc, char* argv[])
{
if((argv[1]=='0')||(argv[1]=="0"))
{printf(“enter\n”)}
return 0;
}
编译成test.exe
dos视窗输入
#test.exe 0
都无法显示预期的enter内容
原因如下
1.argv[1]=='0' 比较pointer和字符
2.argv[1]=="0" 比较两个pointer
正确方式应该如下
a.strcmp((argv[1],"0")==0)
b.std::string(argv[1])=="0"
c.argv[1]==std::string("0")
上面三者都能输出预期的结果
※ 引述《jeromeshih (以谨慎态度来面对问题)》之铭言:
: 一般main的argv会被当作命令列引数
: 假设程式编译好为
: test.exe
: main程式
: int main(int argc, char* argv[])
: 执行方式
: dos视窗输入
: #test.exe 0
: 在argv[0]是“test.exe”
: 但是在argv[1]收到会是什么?
: 因为如果传0给argv似乎不会被当作“0”或\0
: ′0′因为是字符当然也不符合
: 后来有查了一下
: https://goo.gl/z9gYgt
: 似乎char* 0反而会被当作
: null-pointer value of type char *
: 想问一下这算是C++的特殊情况吗,还是遇到0都会有这种现象
:
作者: MOONRAKER (㊣牛鹤鳗毛人)   2017-12-29 23:32:00
喔天阿 你真的在程式里面打全角引号吗
作者: peterwu4 (notd)   2017-12-29 23:45:00
要不要试试 argv[1][0] == '0' 字符比字符才公平XDD
楼主: jeromeshih (以谨慎态度来面对问题)   2017-12-29 23:58:00
1F,原谅一下手机键盘啊
作者: loveflames (咕啾咕啾魔法阵)   2017-12-29 23:59:00

Links booklink

Contact Us: admin [ a t ] ucptt.com