在字符串文字中使用哪些字符是合法的?

时间:2015-02-12 19:09:57

标签: c string character-encoding language-lawyer string-literals

我想知道在C中是否合法字面上asciiTABBELESC个字符直接放在字符串中文字。

无法在Stackoverflow上以纯文本显示字符,所以我不得不换个屏幕截图。

example

没有图形表示的字符使用Caret notation显示,并在屏幕截图中以紫色突出显示。第TAB行还有7个字符,用于缩进文字。

使用gcc -std=c99 -pedantic进行编译时没有任何警告,但它是否真的完全可移植?

这不是我用于任何严肃程序的东西。如果标准允许,我只是好奇。

3 个答案:

答案 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代码。