项目出了问题,因为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 语言规定最后一个字符一定是'