ASCII 非打印字符

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

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

进制十六进制字符 十进制十六进制字符
000 1610数据链路转意
101头标开始 1711设备控制 1
202正文开始 1812设备控制 2
303正文结束 1913设备控制 3
404传输结束 2014设备控制 4
505查询 2115反确认
606确认 2216同步空闲
707震铃 2317传输块结束
808backspace 2418取消
909水平制表符 2519媒体结束
100A换行/新行 261A替换
110B竖直制表符 271B转意
120C换页/新页 281C文件分隔符
130D回车 291D组分隔符
140E移出 301E记录分隔符
150F移入 311F单元分隔符

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

程序为:

 

博客地址: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("--原先--\n%s,size=%d\n",abc,strlen(abc)); 
    
    abc=NoPrinttoQuestionMark(abc); 
    printf("--替换完之后--\n%s,size=%d\n",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 语言规定最后一个字符一定是'\0' 最后一个不用替换的,倒数第二个假如替换的话,要++,这样就超出了限制,直接不替换了.

 

ASCII 打印字符表 

十进制十六进制字符 十进制十六进制字符
3220space 8050P
3321! 8151Q
3422" 8252R
3523# 8353S
3624$ 8454T
3725% 8555U
3826& 8656V
3927' 8757w
4028( 8858X
4129) 8959Y
422A* 905AZ
432B+ 915B[
442C, 925C/
452D- 935D]
462E. 945E^
472F/ 955F_
48300 9660`
49311 9761a
50322 9862b
51333 9963c
52344 10064d
53355 10165e
54366 10266f
55377 10367g
56388 10468h
57399 10569i
583A: 1066Aj
593B; 1076Bk
603C< 1086Cl
613D= 1096Dm
623E> 1106En
633F? 1116Fo
6440@ 11270p
6541A 11371q
6642B 11472r
6743C 11573s
6844D 11674t
6945E 11775u
7046F 11876v
7147G 11977w
7248H 12078x
7349I 12179y
744AJ 1227Az
754BK 1237B{
764CL 1247C|
774DM 1257D}
784EN 1267E~
794FO 1277FDEL


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值