鱼C论坛

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

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

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

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

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

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

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

const char ch[] = 
"\\\###@\
";

int main(void)
{
        printf("%s", ch);
        
        return 0;
}

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

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

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

当然,如果代码中存在不合法转义,那么这个'\'就会被’吃掉',比如:
'\\\###@"
先遇到\\,变成\,后面遇到\#,但因为'\#'是不合法转义,C会把这个 \  "吃掉",所以只有一个'\',后面正常,所以最终结果是 '\###@'

方法二:
这个很简单,如:
"#####\n\
#\n\
#####\n\
#\n\
#\n\
"
每行后面的 \  代表 “这个代码(字符串)太长,我想分两行写", 所以,在电脑里,这个字符串长这样:
"#####\n#\n#####\n#\n#\n"
[注:每行前面不能有空格或制表符,不然编译器会把前面的空白符当作字符串的一部分]
当然,也可以连接普通语句,比如
pri\
ntf("Fishc");

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

const char *letters[] = {
"
########@\
##      @\
##      @\
######  @\
##      @\
##      @\
##      @\
",
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-7 19:48:22 | 显示全部楼层
我做这题的时候发现删掉前面的 ‘\’ 没有影响,而后面的 ‘\’是换行符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

const char ch[] = 
"\\\###@\
";

int main(void)
{
        printf("%s", ch);
        
        return 0;
}
你这段代码会输出 \###@
是因为最后一个 ‘\’是换行符,就是换到下一行继续写的意思,编译器读完这一行后继续读取下一行,并省略‘\’这个符号
而前面只输出 ‘\’ 是因为为了避免输出不了‘\’这个符号,输入两个‘\’符号就可以让编译器知道你要输出 ‘\’ 这个符号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

当然,如果代码中存在不合法转义,那么这个'\'就会被’吃掉',比如:
'\\\###@"
先遇到\\,变成\,后面遇到\#,但因为'\#'是不合法转义,C会把这个 \  "吃掉",所以只有一个'\',后面正常,所以最终结果是 '\###@'

方法二:
这个很简单,如:
"#####\n\
#\n\
#####\n\
#\n\
#\n\
"
每行后面的 \  代表 “这个代码(字符串)太长,我想分两行写", 所以,在电脑里,这个字符串长这样:
"#####\n#\n#####\n#\n#\n"
[注:每行前面不能有空格或制表符,不然编译器会把前面的空白符当作字符串的一部分]
当然,也可以连接普通语句,比如
pri\
ntf("Fishc");

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

原来是这样,以前只知道第一种转义的用法
这下知道了,谢谢~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


又双帮助了一个鱼油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-7 21:02:14 | 显示全部楼层
非常感谢~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 22:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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