• ASCII 非打印字符


    项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了.

    解决方式为先找到非打印字符,这是我从网上找的非打印字符表:

    进制 十六进制 字符   十进制 十六进制 字符
    0 00   16 10 数据链路转意
    1 01 头标开始   17 11 设备控制 1
    2 02 正文开始   18 12 设备控制 2
    3 03 正文结束   19 13 设备控制 3
    4 04 传输结束   20 14 设备控制 4
    5 05 查询   21 15 反确认
    6 06 确认   22 16 同步空闲
    7 07 震铃   23 17 传输块结束
    8 08 backspace   24 18 取消
    9 09 水平制表符   25 19 媒体结束
    10 0A 换行/新行   26 1A 替换
    11 0B 竖直制表符   27 1B 转意
    12 0C 换页/新页   28 1C 文件分隔符
    13 0D 回车   29 1D 组分隔符
    14 0E 移出   30 1E 记录分隔符
    15 0F 移入   31 1F 单元分隔符

    当碰到这样的打印字符的时候,替换成问号?

    程序为:

    博客地址:http://blog.csdn.net/dlxuemin/article/details/1576975

    知道了他们的ascII码之后,可以将原先在字符串中的非打印字符用问号?过滤 

    函数为

    // yyy.cpp : Defines the entry point for the console application.
    //
    
    
    #include "stdafx.h"
    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>    
    #include <malloc.h>  
    #define MAX_MESSAGE_LENGTH 1000
    char matchStr1[]="111,aaa,ddd";  
     static char * NoPrinttoQuestionMark(char *src)
     {
         char *p = src;
         char dest[MAX_MESSAGE_LENGTH + 1024];
         memset(dest,0,sizeof(dest));
         char *q = dest;
         int dst_len = sizeof (dest);
                 while(0 != *p && dst_len > 2)
                 {
                     if(*p >0x1F)
                     {
                         *q++ = *p++;
                     } else {
                             *q++ = '?';
                             p++;
                     }
                     dst_len--;
                 }
                 *q = 0;
      return dest;
     }  
     
    int main(int argc, char* argv[])
    {
    
        char * abc="333 333 aaa aaa ddd 444 aaa 666"; 
        printf("--原先--
    %s,size=%d
    ",abc,strlen(abc)); 
        
        abc=NoPrinttoQuestionMark(abc); 
        printf("--替换完之后--
    %s,size=%d
    ",abc,strlen(abc));      
        return 0;
    }

    当然 看到这段代码之后我们发现两个问题

    (1):while(0 != *p && dst_len > 1)

    在这个循环体中,有一个

    if(*p >0x1F) 假如我们希望,将制表符,回车,换行,单元分割符过滤掉的话,应当改成:

       if(*p >=0x1F|| *p == 0x0a||*p==0x0D||*p==0x09)
    (2) dst_len > 2 的原因是说 C 语言规定最后一个字符一定是'' 最后一个不用替换的,倒数第二个假如替换的话,要++,这样就超出了限制,直接不替换了.

     

    ASCII 打印字符表 

    十进制 十六进制 字符   十进制 十六进制 字符
    32 20 space   80 50 P
    33 21 !   81 51 Q
    34 22 "   82 52 R
    35 23 #   83 53 S
    36 24 $   84 54 T
    37 25 %   85 55 U
    38 26 &   86 56 V
    39 27 '   87 57 w
    40 28 (   88 58 X
    41 29 )   89 59 Y
    42 2A *   90 5A Z
    43 2B +   91 5B [
    44 2C ,   92 5C /
    45 2D -   93 5D ]
    46 2E .   94 5E ^
    47 2F /   95 5F _
    48 30 0   96 60 `
    49 31 1   97 61 a
    50 32 2   98 62 b
    51 33 3   99 63 c
    52 34 4   100 64 d
    53 35 5   101 65 e
    54 36 6   102 66 f
    55 37 7   103 67 g
    56 38 8   104 68 h
    57 39 9   105 69 i
    58 3A :   106 6A j
    59 3B ;   107 6B k
    60 3C <   108 6C l
    61 3D =   109 6D m
    62 3E >   110 6E n
    63 3F ?   111 6F o
    64 40 @   112 70 p
    65 41 A   113 71 q
    66 42 B   114 72 r
    67 43 C   115 73 s
    68 44 D   116 74 t
    69 45 E   117 75 u
    70 46 F   118 76 v
    71 47 G   119 77 w
    72 48 H   120 78 x
    73 49 I   121 79 y
    74 4A J   122 7A z
    75 4B K   123 7B {
    76 4C L   124 7C |
    77 4D M   125 7D }
    78 4E N   126 7E ~
    79 4F O   127 7F DEL


  • 相关阅读:
    6、查看历史记录
    A Tour of Go Range
    Go Slices: usage and internals
    A Tour of Go Nil slices
    A Tour of Go Making slices
    A Tour of Go Slicing slices
    A Tour of Go Slices
    A Tour of Go Arrays
    A Tour of Go The new function
    A Tour of Go Struct Literals
  • 原文地址:https://www.cnblogs.com/aspirant/p/3580533.html
Copyright © 2020-2023  润新知