命令行参数中的;会终止字符串吗?C语言传参异常问题求助
问题本质
你的C程序代码逻辑没有问题,该现象和C语言本身无关,是命令行Shell的预解析规则导致的。
你输入命令的终端Shell会先对整行输入做语法解析,拆分命令、参数、特殊操作符后才会把解析后的参数传递给程序。你遇到的;、)都属于Shell的特殊元字符,会被提前识别为语法标记,不会作为普通文本参数传递:
;是Shell的命令分隔符,作用是在同一行分割多个独立命令。你输入./a.out Hello;时,Shell会直接把内容拆分为两条独立命令:第一条是./a.out Hello,第二条是空命令,自然;不会被传入程序,这就是你测试时只输出o(Hello的最后一个字符)的原因。)是Shell括号语法的结束标记,同样会被提前解析为语法符号,不会作为参数内容。- 这些元字符后的内容会被Shell当作独立命令处理,所以会触发“command not found”报错。
解决方法
要让Shell把这些特殊字符当作普通文本传递给程序,有两种通用方案:
用单引号包裹包含特殊字符的参数
单引号包裹的所有内容,Shell都会当作纯文本处理,不会解析其中的任何特殊符号,直接原样传递给程序。比如要传Hello;作为参数,执行命令改为:./a.out 'Hello;'
如果要传多个带特殊符号的参数,分别包裹即可:./a.out 'Hello;' 'And)'用反斜杠
\对特殊字符单独转义
如果不想用引号包裹,也可以在每个特殊符号前加转义符\,显式告诉Shell该字符是普通文本:./a.out Hello\; And\)
修改调用方式后重新运行你的测试代码,就能正确拿到包含特殊符号的完整参数,输出预期结果。
内容的提问来源于stack exchange,提问作者Cyber_Potato
相关产品推荐
相关产品推荐

