鱼C论坛

 找回密码
 立即注册
查看: 2478|回复: 8

[已解决]关于字符串中的“\”,让我迷惑

[复制链接]
发表于 2022-9-7 19:10:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
const char *letters[] = {
"\
\########@\
\##      @\
\##      @\
\######  @\
\##      @\
\##      @\
\##      @\
",

这是第28课课后题最后一道, 这里用了大量的“\”和回车的组合,在读取这个字符串的时候直接忽略了“\”的存在
谁能告诉我单独用“\”是一个什么用法?

  1. #include<stdio.h>

  2. const char ch[] =
  3. "\\\###@\
  4. ";

  5. int main(void)
  6. {
  7.         printf("%s", ch);
  8.        
  9.         return 0;
  10. }
复制代码


这段代码会输出 \###@  第3个和最后一个“\”都会被忽略,这个我很迷惑。。。。。。
请各位大佬们出手相助,在此谢过~~~~
最佳答案
2022-9-7 20:11:04
本帖最后由 zhangjinxuan 于 2022-9-7 21:03 编辑

这个叫 《转义》,转义字符有两种作用:
1. 表示特殊、非可见字符,比如 :'\n' 换行    '\0'结束符
2. 将一个字符串分多行显示

方法一讲解:写一个 反斜杠,表示转义开始
常见的转义字符表有这些:
  1. '\a'   终端响铃,如果你在centos7系统中printf("\a"),虚拟机会发出‘滴答’的声音
  2. '\b'  退格,将当前位置退回前一列,你可以试试printf("fishd\bc"),看看会发生什么
  3. '\n'   换行,光标移至下一行开头
  4. '\r'   将光标移到本行开头,试试printf("ddfsd \r fishc")
  5. '\0'   结束符,不讲
  6. '"'   表示一个双引号,试试printf("\"");
  7. '\\'    表示\,如printf("\\")
  8. ...
复制代码


当然,如果代码中存在不合法转义,那么这个'\'就会被’吃掉',比如:
  1. '\\\###@"
复制代码

先遇到\\,变成\,后面遇到\#,但因为'\#'是不合法转义,C会把这个 \  "吃掉",所以只有一个'\',后面正常,所以最终结果是 '\###@'

方法二:
这个很简单,如:
  1. "#####\n\
  2. #\n\
  3. #####\n\
  4. #\n\
  5. #\n\
  6. "
复制代码

每行后面的 \  代表 “这个代码(字符串)太长,我想分两行写", 所以,在电脑里,这个字符串长这样:
  1. "#####\n#\n#####\n#\n#\n"
复制代码

[注:每行前面不能有空格或制表符,不然编译器会把前面的空白符当作字符串的一部分]
当然,也可以连接普通语句,比如
  1. pri\
  2. ntf("Fishc");
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-7 19:47:29 | 显示全部楼层
你可以这样写

const char *letters[] = {
"
########@\
##      @\
##      @\
######  @\
##      @\
##      @\
##      @\
",
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 19:48:22 | 显示全部楼层
我做这题的时候发现删掉前面的 ‘\’ 没有影响,而后面的 ‘\’是换行符。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 19:58:30 | 显示全部楼层
本帖最后由 gandixiwang 于 2022-9-7 20:00 编辑
  1. #include<stdio.h>

  2. const char ch[] =
  3. "\\\###@\
  4. ";

  5. int main(void)
  6. {
  7.         printf("%s", ch);
  8.         
  9.         return 0;
  10. }
复制代码

你这段代码会输出 \###@
是因为最后一个 ‘\’是换行符,就是换到下一行继续写的意思,编译器读完这一行后继续读取下一行,并省略‘\’这个符号
而前面只输出 ‘\’ 是因为为了避免输出不了‘\’这个符号,输入两个‘\’符号就可以让编译器知道你要输出 ‘\’ 这个符号。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 20:07:39 | 显示全部楼层
gandixiwang 发表于 2022-9-7 19:48
我做这题的时候发现删掉前面的 ‘\’ 没有影响,而后面的 ‘\’是换行符。

第一个“\”不能删,会被认为是序编译指令。
按照小甲鱼能简不繁的风格,这样写肯定是有原因的,借助这个“\”摆出了想要打印的字符形状,很直观。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 20:11:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zhangjinxuan 于 2022-9-7 21:03 编辑

这个叫 《转义》,转义字符有两种作用:
1. 表示特殊、非可见字符,比如 :'\n' 换行    '\0'结束符
2. 将一个字符串分多行显示

方法一讲解:写一个 反斜杠,表示转义开始
常见的转义字符表有这些:
  1. '\a'   终端响铃,如果你在centos7系统中printf("\a"),虚拟机会发出‘滴答’的声音
  2. '\b'  退格,将当前位置退回前一列,你可以试试printf("fishd\bc"),看看会发生什么
  3. '\n'   换行,光标移至下一行开头
  4. '\r'   将光标移到本行开头,试试printf("ddfsd \r fishc")
  5. '\0'   结束符,不讲
  6. '"'   表示一个双引号,试试printf("\"");
  7. '\\'    表示\,如printf("\\")
  8. ...
复制代码


当然,如果代码中存在不合法转义,那么这个'\'就会被’吃掉',比如:
  1. '\\\###@"
复制代码

先遇到\\,变成\,后面遇到\#,但因为'\#'是不合法转义,C会把这个 \  "吃掉",所以只有一个'\',后面正常,所以最终结果是 '\###@'

方法二:
这个很简单,如:
  1. "#####\n\
  2. #\n\
  3. #####\n\
  4. #\n\
  5. #\n\
  6. "
复制代码

每行后面的 \  代表 “这个代码(字符串)太长,我想分两行写", 所以,在电脑里,这个字符串长这样:
  1. "#####\n#\n#####\n#\n#\n"
复制代码

[注:每行前面不能有空格或制表符,不然编译器会把前面的空白符当作字符串的一部分]
当然,也可以连接普通语句,比如
  1. pri\
  2. ntf("Fishc");
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 20:56:49 | 显示全部楼层
zhangjinxuan 发表于 2022-9-7 20:11
这个叫 《转义》,转义字符有两种作用:
1. 表示特殊、非可见字符,比如 :'\n' 换行    '\0'结束符
2.  ...

原来是这样,以前只知道第一种转义的用法
这下知道了,谢谢~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 20:58:05 | 显示全部楼层
两手空空儿 发表于 2022-9-7 20:56
原来是这样,以前只知道第一种转义的用法
这下知道了,谢谢~~~~~


又双帮助了一个鱼油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 21:02:14 | 显示全部楼层
非常感谢~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表