免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10318 | 回复: 15
打印 上一主题 下一主题

[悬赏] [请教] C程序, 反斜杠 \ 作为命令行参数,会被当做转义符还是字符反斜杠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-22 01:05 |只看该作者 |倒序浏览
20可用积分
本帖最后由 nine8 于 2010-06-22 01:19 编辑

请教下, 当 反斜杠 出现在 命令参数中时, 会被当做转义符还是 字符 '\\' ,

通过几个小程序的测试,发现似乎会被当做转义符,不知道是什么原因, 如:

  tt aaa\bbb

----------------------------------------------------------------------------------
[1] . 只会把 \当做转义符来处理, 为什么不是当做 字符 反斜杠呢?

[2] . argv 指向字符串, 那么 \ 为什么不是 字符串中的一个字符呢?


[3] . 另外, 单一的转义符有代表什么含义? 似乎没法在C中实现单一输出转义符 \ 吧, 不知道这种获取参数中转义符是如何编写的呢?

[4].  如何编写C,才使得不把命令行参数中出现的转义符\当做转义符,而是直接当做字符 \ ?


还请大家指教

最佳答案

查看完整内容

你显然还没把sh/bash的文法和C文法区分清楚。你的命令行是sh/bash文法,argv拿到的就是按C文法处理了。在sh/bash文法里面,\a是无效的,所以\被忽略了。参见:http://www.gnu.org/software/bash ... ml#Escape-Character另外bash还提供了一个语法(注意要用$'带反斜杠字符串'):http://www.gnu.org/software/bash ... #ANSI_002dC-Quoting

论坛徽章:
0
2 [报告]
发表于 2010-06-22 01:05 |只看该作者
本帖最后由 没本 于 2010-06-23 01:58 编辑

你显然还没把sh/bash的文法和C文法区分清楚。你的命令行是sh/bash文法,argv拿到的就是按C文法处理了。在sh/bash文法里面,\a是无效的,所以\被忽略了。参见:
http://www.gnu.org/software/bash ... ml#Escape-Character

  1. 3.1.2.1 Escape Character

  2. A non-quoted backslash ‘\’ is the Bash escape character. It preserves the literal value of the next character that follows, with the exception of newline. If a \newline pair appears, and the backslash itself is not quoted, the \newline is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).
复制代码
另外bash还提供了一个语法(注意要用$'带反斜杠字符串'):
http://www.gnu.org/software/bash ... #ANSI_002dC-Quoting

  1. 3.1.2.4 ANSI-C Quoting

  2. Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:

  3. \a
  4. alert (bell)
  5. \b
  6. backspace
  7. \e
  8. \E
  9. an escape character (not ANSI C)
  10. \f
  11. form feed
  12. \n
  13. newline
  14. \r
  15. carriage return
  16. \t
  17. horizontal tab
  18. \v
  19. vertical tab
  20. \\
  21. backslash
  22. \'
  23. single quote
  24. \"
  25. double quote
  26. \nnn
  27. the eight-bit character whose value is the octal value nnn (one to three digits)
  28. \xHH
  29. the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  30. \cx
  31. a control-x character
  32. The expanded result is single-quoted, as if the dollar sign had not been present.
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-06-22 02:30 |只看该作者
1. 这个与C无关,命令行的语法这么规定的,方便如文件名带空格作为参数等特殊情况的表示。
2. argv收到的已经是命令行shell处理并且传入的了,所以反斜杠转义已经完成,得到的是转义之后的结果。
3. 从命令行参数中获得在C字符串表达的\,直接在命令行用\\就可以了。
4. 你可以预处理一遍啊,比如实现一个函数pre_translate( argv[1], out_arg, &out_len ),输出到out_arg,看到\就转成\\;还有一个办法是命令行传入时,直接写成\\\\。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2010-06-22 08:54 |只看该作者
LS在中国么?2:30还在回帖{:3_186:}

论坛徽章:
0
5 [报告]
发表于 2010-06-22 10:03 |只看该作者
看球的吧。。。

论坛徽章:
0
6 [报告]
发表于 2010-06-22 10:03 |只看该作者
lz一点发帖,都是球迷啊。。。

论坛徽章:
0
7 [报告]
发表于 2010-06-22 10:53 |只看该作者
argv里的'\'都是处理好的,不用在'\\'转义了。

论坛徽章:
0
8 [报告]
发表于 2010-06-22 11:47 |只看该作者
本帖最后由 狗气球 于 2010-06-22 11:56 编辑

转义符是解析字符串的时候起作用的。

反斜杠刚好既是C语言字符串中的转义符,也是楼主使用的shell的命令行转义符。结果搞混了。这个问题和C语言转义符没关系。

键盘输入-->(shell转义)-->传给程序的命令行参数(argv[])

****
[1] . 只会把 \当做转义符来处理, 为什么不是当做 字符 反斜杠呢?
    这个取决于你用的shell,你用的shell把反斜杠当做转义符。假如你像我现在在用windowsXP的cmd命令行,你会发现它不认为\是转义符。

[2] . argv 指向字符串, 那么 \ 为什么不是 字符串中的一个字符呢?
    因为命令行输入的单个\被shell当做转义符,没有被解释为\,所以你的程序也就没有得到你期望的\。

[3] . 另外, 单一的转义符有代表什么含义? 似乎没法在C中实现单一输出转义符 \ 吧, 不知道这种获取参数中转义符是如何编写的呢?
    单一的转义符应该不代表什么意义。
    C语言要输出‘\’没什么特别的,这本来就是个可打印字符,和'a','b'一样。
    但是,对C编译器来说,\是''和""中的转义符,为了表示真正的\字符,你只能用\\。例如'\\'代表一个反斜杠字符。"aa\\bb"代表字符串aa\bb。

[4].  如何编写C,才使得不把命令行参数中出现的转义符\当做转义符,而是直接当做字符 \ ?
    这个问题不是问题。命令行参数中的\转义符是shell决定的,和你的C程序无关。

论坛徽章:
0
9 [报告]
发表于 2010-06-22 21:38 |只看该作者
  1. 1 #include <stdio.h>
  2.       2
  3.       3
  4.       4 int main(int argc, char *argv[]) {
  5.       5
  6.       6     argv++;
  7.       7     if (**argv == '\a') {
  8.       8         printf("got it \n");
  9.       9     }
  10.      10     else if(**argv == '\\') {
  11.      11         printf("got escape\n");
  12.      12     }
  13.      13     else {
  14.      14         printf("no escape\n");
  15.      15         putchar(**argv);
  16.      16     }
  17.      17
  18.      18     return 0;
  19.      19
  20.      20 }
复制代码
如上程序,

当我执行,  tt  \a, 结果却是 "no escape",然后输出 a, 也就是没有把 \a当做一个字符,而是把其\和a当做俩个处理,\被忽略

而我执行  tt \\, 结果却是 "got escaoe", 也就是说把 \\作为反斜杠字符了,

这是为什么?难道只会对 \\转义, 其他的都不行?

按照大家上面提到的似乎不好解释这个 , 还请大家指教

论坛徽章:
0
10 [报告]
发表于 2010-06-23 01:16 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP