C语言,字符串中,溢出字符(ASCII码=27)怎样处理?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,字符串中,溢出字符(ASCII码=27)怎样处理?相关的知识,希望对你有一定的参考价值。

linux环境,代码如下(图中黄色方框的字符'^[',为溢出字符,ASCII码=27)

程序运行结果如图

为何第15行printf没有将s[0]中保存的'a'打印出来?
且若不注释12,13行代码,第15行printf的输出为"abc23".

求教,字符串中的溢出字符到底有何作用?
环境:
Linux version 2.6.32-279.el6.x86_64 (mockbuild@x86-008.build.bos.redhat.com) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) )

我在win7和ubuntu上用你的代码跑的时候,"^["都是被当做两个字符处理的。

然后在win7和ubuntu上测试了,"^[“应该是指输入时按”Ctrl+[“表示输入27号字符。

win7:

ubuntu:


然后,把sprintf改成sprintf(s, "%s%c", p, 27);

win7:

ubuntu:



最后,我并不知道ESC有什么卵用..

追问

辛苦了.
1,把'^['当做一个字符输入,在vim中可以在insert模式下,按Ctrl+v后,再按Esc键即可.
2,这个符号在我的电脑上跑的时候,确实影响了printf的输出结果,但我不清楚这是编译器导致的还是系统环境导致的.
3,谢谢您的帮助,如果今天22:00前,没有收到更详细的答案的话,我会采纳这条回答.

参考技术A 这取决于编译器行为,我在clang上实验和你结果完全不同追问

能说一下系统环境么?谢谢.
还有,能不能把代码和结果的图贴出来.

参考技术B 我看了一下你说的那个溢出字符^[,相关解释是这样的:
字符Escape,是ASCII标准的首创的,由Bob Bemer提议的。用于开始一段控制码的扩展字符。如此,即可以不必将所有可能想得到的字符都放到ASCII标准中了。
因为,新的技术可能需要新的控制命令,而ESC可以用作这些字符命令的起始标志。
也就是说,并没有什么用。你的问题不是因为这个字符而导致的,很多编译器会做一定的优化,比如说上面两位朋友编译出来的结果就完全不同一样,我在gcc编译器下面也试了一下,也没有能检测到这个字符。
所以,如果不是非常必要的话,你可以放弃对这个字符的研究了!本回答被提问者采纳

c语言字符ASCLL码顺序

如‘D’的ASCLL为68,那么‘D’+9的字符为?能讲讲怎么弄的吗?我不会…谢谢

    ASCII码大致可以分作三部分组成。
    第一部分是:ASCII非打印控制字符; 
    第二部分是:ASCII打印字符; 
    第三部分是:扩展ASCII打印字符。

    第一部分:ASCII非打印控制字符表

    ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。例如,12代表换页/新页功能。此命令指示打印机跳到下一页的开头。(参详ASCII码表中0-31)

    第二部分:ASCII打印字符

    数字 32–126 分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现。数字127代表 DELETE 命令。(参详ASCII码表中32-127)

    ASCII码表 0-127


    Bin            Dec    Hex    缩写/字符    解释    

    00000000    0    00    NUL(null)    空字符    

    00000001    1    01    SOH(start of headling)    标题开始    

    00000010    2    02    STX (start of text)    正文开始    

    00000011    3    03    ETX (end of text)    正文结束    

    00000100    4    04    EOT (end of transmission)    传输结束    

    00000101    5    05    ENQ (enquiry)    请求    

    00000110    6    06    ACK (acknowledge)    收到通知    

    00000111    7    07    BEL (bell)    响铃    

    00001000    8    08    BS (backspace)    退格    

    00001001    9    09    HT (horizontal tab)    水平制表符    

    00001010    10    0A    LF (NL line feed, new line)    换行键    

    00001011    11    0B    VT (vertical tab)    垂直制表符    

    00001100    12    0C    FF (NP form feed, new page)    换页键    

    00001101    13    0D    CR (carriage return)    回车键    

    00001110    14    0E    SO (shift out)    不用切换    

    00001111    15    0F    SI (shift in)    启用切换    

    00010000    16    10    DLE (data link escape)    数据链路转义    

    00010001    17    11    DC1 (device control 1)    设备控制1    

    00010010    18    12    DC2 (device control 2)    设备控制2    

    00010011    19    13    DC3 (device control 3)    设备控制3    

    00010100    20    14    DC4 (device control 4)    设备控制4    

    00010101    21    15    NAK (negative acknowledge)    拒绝接收    

    00010110    22    16    SYN (synchronous idle)    同步空闲    

    00010111    23    17    ETB (end of trans. block)    传输块结束    

    00011000    24    18    CAN (cancel)    取消    

    00011001    25    19    EM (end of medium)    介质中断    

    00011010    26    1A    SUB (substitute)    替补    

    00011011    27    1B    ESC (escape)    溢出    

    00011100    28    1C    FS (file separator)    文件分割符    

    00011101    29    1D    GS (group separator)    分组符    

    00011110    30    1E    RS (record separator)    记录分离符    

    00011111    31    1F    US (unit separator)    单元分隔符    

    00100000    32    20    (space)    空格    

    00100001    33    21    !         

    00100010    34    22    "         

    00100011    35    23    #         

    00100100    36    24    $         

    00100101    37    25    %         

    00100110    38    26    &         

    00100111    39    27    '         

    00101000    40    28    (         

    00101001    41    29    )         

    00101010    42    2A    *         

    00101011    43    2B    +         

    00101100    44    2C    ,         

    00101101    45    2D    -         

    00101110    46    2E    .         

    00101111    47    2F    /         

    00110000    48    30    0         

    00110001    49    31    1         

    00110010    50    32    2         

    00110011    51    33    3         

    00110100    52    34    4         

    00110101    53    35    5         

    00110110    54    36    6         

    00110111    55    37    7         

    00111000    56    38    8         

    00111001    57    39    9         

    00111010    58    3A    :         

    00111011    59    3B    ;         

    00111100    60    3C    <         

    00111101    61    3D    =         

    00111110    62    3E    >         

    00111111    63    3F    ?         

    01000000    64    40    @         

    01000001    65    41    A         

    01000010    66    42    B         

    01000011    67    43    C         

    01000100    68    44    D         

    01000101    69    45    E         

    01000110    70    46    F         

    01000111    71    47    G         

    01001000    72    48    H         

    01001001    73    49    I         

    01001010    74    4A    J         

    01001011    75    4B    K         

    01001100    76    4C    L         

    01001101    77    4D    M         

    01001110    78    4E    N         

    01001111    79    4F    O         

    01010000    80    50    P         

    01010001    81    51    Q         

    01010010    82    52    R         

    01010011    83    53    S         

    01010100    84    54    T         

    01010101    85    55    U         

    01010110    86    56    V         

    01010111    87    57    W         

    01011000    88    58    X         

    01011001    89    59    Y         

    01011010    90    5A    Z         

    01011011    91    5B    [         

    01011100    92    5C    \\         

    01011101    93    5D    ]         

    01011110    94    5E    ^         

    01011111    95    5F    _         

       0110000    96    60    `         

       01100001    97    61    a         

       01100010    98    62    b         

01100011    99    63    c         

01100100    100    64    d         

01100101    101    65    e         

01100110    102    66    f         

01100111    103    67    g         

01101000    104    68    h         

01101001    105    69    i         

01101010    106    6A    j         

01101011    107    6B    k         

01101100    108    6C    l         

01101101    109    6D    m         

01101110    110    6E    n         

01101111    111    6F    o         

01110000    112    70    p         

01110001    113    71    q         

01110010    114    72    r         

01110011    115    73    s         

01110100    116    74    t         

01110101    117    75    u         

01110110    118    76    v         

01110111    119    77    w         

01111000    120    78    x         

01111001    121    79    y         

01111010    122    7A    z         

01111011    123    7B             

01111100    124    7C    |         

01111101    125    7D             

01111110    126    7E    ~         

01111111    127    7F    DEL (delete)    删除    


  3. 第三部分:扩展ASCII打印字符

     扩展的ASCII字符满足了对更多字符的需求。扩展的ASCII包含ASCII中已有的128个字        符(数字0–32显示在下图中),又增加了128个字符,总共是256个。即使有了这些更      多的字符,许多语言还是包含无法压缩到256个字符中的符号。因此,出现了一些            ASCII的变体来囊括地区性字符和符号。例如,许多软件程序把ASCII表(又称作                 ISO8859-1)用于北美、西欧、澳大利亚和非洲的语言。

参考技术A D+9后 是 M
小写字母的十进制数字表示范围:(起始是小写a)97~122
大写的范围是:(起始是大写A)61~86
你如果不懂这ascll 码排列方法,你去搜索一下,自己看看。我说不明白

参考资料:如果您的回答是从其他地方引用,请表明出处

本回答被提问者采纳

以上是关于C语言,字符串中,溢出字符(ASCII码=27)怎样处理?的主要内容,如果未能解决你的问题,请参考以下文章

c语言字符与ASCII码的转换

c语言编程中如何显示字符的ASCII码值?

c语言怎么求字符的ascii码

c语言怎么求字符的ascii码

c语言中如何将一个字符ascii码转换为整型数

c语言ASCII码排序