我想知道在C中是否合法字面上将ascii
,TAB
和BEL
等ESC
个字符直接放在字符串中文字。
无法在Stackoverflow上以纯文本显示字符,所以我不得不换个屏幕截图。
没有图形表示的字符使用Caret notation显示,并在屏幕截图中以紫色突出显示。第TAB
行还有7
个字符,用于缩进文字。
使用gcc -std=c99 -pedantic
进行编译时没有任何警告,但它是否真的完全可移植?
这不是我用于任何严肃程序的东西。如果标准允许,我只是好奇。
答案 0 :(得分:2)
可以在程序源中使用的可移植字符就是:
拉丁字母的26个大写字母
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
拉丁字母的26个小写字母
a b c d e f g h i j k l m
n o p q r s t u v w x y z
10位小数
0 1 2 3 4 5 6 7 8 9
以下29个图形字符
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
来源:C标准,任何版本。
实现必须接受这些字符,并且允许接受任何其他字符。
答案 1 :(得分:1)
如果反斜杠立即出现在文字换行符(不是\n
)之前,则会删除反斜杠和换行符。除了三角形之间的线条之外,线条可以像任何地方一样被分割(如果三线图被反斜杠 - 换行符序列分割,该序列被删除,但三元组保持不变)。
字符串文字(在可移植代码中)允许使用文字制表符,其语义与\t
相同。 C11(n1570)6.4.5 p1状态,&#34;源字符集的任何成员,除了双引号"
,反斜杠\
或换行符#34;可以是字符串文字的一部分,制表符是源字符集的一部分(同上.5.2.1 p3)。
转义字符(\e
,ASCII 0x1b)不是源字符集的一部分,甚至可能根本不存在(在非ASCII系统上)。同样适用于换页,但\f
是C标准的一部分。这些字符不能移植使用。
实现可以自由地接受它喜欢的任何字符(除了标准的最低要求),从源字符集到执行字符集的映射是实现定义的(实现可以映射源中的不同字符)代码相等的字符)。
答案 2 :(得分:-1)
以空值终止的字符串只是一些8位值,可能是0-255或-128-127,具体取决于它们的签名。
当您将字节发送到终端之类的终端时,终端由终端决定如何处理字节。一些字节如&#39; a&#39; - &#39; z&#39;可能是标准的,但只有你假设8位字符编码。其他字节如&#39;€&#39;可能只能使用正确的字符集正确显示。
最后我们有那些终端控制字节来控制光标并响铃。终端可以处理这些字节,但写入它们仍然是有效的C代码。