c++如何读取字符串汉字

c++如何读取文本文件中的汉字,通过wifstream和locale

1个回答

我之前写了一个MFC程序,用来统计文本文件中的每个不同汉字、26个字母的个数
并且排序出出现的最多的三个字符(汉字与字母一视同仁)

下面的是其中的核心处理片段
希望能帮助到你

void C文本统计Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    int len, flag;
    int sum[9999];
    TCHAR ch[9999];
    CString chtmp;
    CString str;
    for (int i = 0; i<9999; i++)
        sum[i] = 0;

    GetDlgItemText(IDC_EDIT1, str);
    len = str.GetLength();
    flag = 0;
    if (len != 0) {
        //计数
        for (int i = 0; i < len; i++)
        {
            TCHAR unitemp = str.GetAt(i);     //TCHAR 可以保存双字节字符,如汉字
            if (!(_istpunct(unitemp)||_istspace(unitemp)||(unitemp == '\n')))  //判断是否为标点、特殊字符、空格、换行
            {
                int f = 1;
                for (int j = 0; j < flag; j++)
                    if (unitemp == ch[j])
                    {
                        sum[j]++;
                        f = 0;
                    }
                if (f == 1)
                {
                    ch[flag] = unitemp;
                    sum[flag] = 1;
                    flag++;
                }
         }
        }
        //进行排序
        for (int i = 1; i<flag; i++)
            for (int j = 0; j<i; j++)
                if (sum[j]<sum[i])
                {
                    int t = sum[i]; sum[i] = sum[j]; sum[j] = t;
                    wchar_t c = ch[i]; ch[i] = ch[j]; ch[j] = c;
                }

        CString str_tmp;
        chtmp.Insert(0, ch[0]);
        str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[0]);
        SetDlgItemText(IDC_EDIT2, str_tmp);
        chtmp.Empty();
        if (flag>1)
        {
            chtmp.Insert(0, ch[1]);
            str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[1]);
            SetDlgItemText(IDC_EDIT3, str_tmp);
            chtmp.Empty();
        }
        else
            {
                str_tmp.Format(_T(" "));
                SetDlgItemText(IDC_EDIT3, str_tmp);
            }
        if (flag > 2)
        {
            chtmp.Insert(0, ch[2]);
            str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[2]);
            SetDlgItemText(IDC_EDIT4, str_tmp);
            chtmp.Empty();
        }
        else
        {
            str_tmp.Format(_T(" "));
            SetDlgItemText(IDC_EDIT4, str_tmp);
        }
    }
    else
    {
        MessageBox(_T("请先输入文字或从文件导入。"));
    }

}

RDS__
RDS__ 回复qingshengling: 去查一下编码的相关知识,根据编码规则来判别
接近 3 年之前 回复
qingshengling
嗯嗯好吧 双字节的怎么判别类别呀,双字节存储的汉字根本就无法输出呀
接近 3 年之前 回复
RDS__
RDS__ 回复qingshengling:我觉得可以将你的文本用wchar来保存,就是全部存成双字节,然后再做一下判别归类
接近 3 年之前 回复
RDS__
RDS__ 回复LKSP: 对 是MFC里面的
接近 3 年之前 回复
pluspplus
SHA-ZI 回复qingshengling: 他的是MFC里封装的类
接近 3 年之前 回复
qingshengling
嗯嗯好吧 我想要把文本文件中的数字,字母,汉字分别取出应该怎么做
接近 3 年之前 回复
qingshengling
嗯嗯好吧 TCHAR是你自己定义的类吗
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++如何读取字符串汉字
c++如何读取文本文件中的汉字,通过wifstream和locale
c++怎么将字符串中的汉字和数字分别存入不同字符指针所指空间?
#include<iostream> #include<fstream> #include<string> #include <cstdlib> using namespace std; int read(char *ch){ cout<<ch<<endl; ofstream outfile; outfile.open("test.txt",ios::out|ios::app); if(!outfile){ cout<<"不能打开目的文件:test.txt"<<endl; } char*endptr,*str,*mname; int i,k,Dose; for(i=0;ch[i]<'0'||ch[i]>'9';i++) mname[i]=ch[i]; mname[i]='\0'; for(k=0;ch[i]>='0'&&ch[i]<='9';i++,k++){ str[k]=ch[i]; } Dose=strtol(str,&endptr,10); outfile<<mname<<Dose<<endl; outfile.close(); return i; } void Handle(char ch[]){ char filen[256]; strcpy(filen,ch); ifstream infile1; infile1.open(filen,ios::in); while(!infile1) { cout<<"不能打开输入文件夹:"<<filen<<'\n'; cout<<"再次输入原始文件:"; cin>>filen; infile1.clear(); infile1.open(filen,ios::in); } infile1.unsetf(ios::skipws); char buf[10000]; int cir=0,bt=0; while(infile1.getline(buf,10000)) //一行一行进行读取文件一 { char*begin=buf; do{ bt=read(begin); if(begin+bt+3!=NULL){ begin+bt+3; cir=1; } else cir=0; }while(cir=1); } infile1.close(); } int main(){ char testfilename[256]; cout<<"请输入原始文件: "; cin>>testfilename; Handle(testfilename); } 其中测试文件:1.txt内容为 党参1克,当归10克 连翘5克 党参和1分别存储在char*mname和char*str中,后将char*str转换成int值
c#汉字字符串格式化问题
我是通过流的方式把字符串输向打印机的,可是系统把一个汉字字符当成一个字节,我 需要控制文本的统一长度,然后问题来了,由于一个汉字占两个字节,我用不足位用0补 足就导致实际长度与我设想的长度不一样,求大神帮忙解决一下,以下是代码段: p.PrintText(liu, "" +sdr["dishname"] + ""); 这段代码中“liu"是流,sdr["dishname"]是从数据库读取的数据。
C#中调用C++Dll接口,字符串编码问题
**在C#中调用C++Dll接口,接口返回一个多字节字符串,然后再C#中再次转码为宽字节字符串。 字符串内容都为汉字。** # **_问题: 如果汉字为偶数个,则一切正常; 如果汉字为奇数个,则C#获得的多字节字符串内容的最后一个字节被篡改成‘?’的ascll码。(多字节编码时,每个汉字占三个字节) 本人没多少币,全部家当拿出来了,求大神指点。**_ ## C++代码: // 宽字节转多字节 __declspec(dllexport) void TCharToChar(LPCWCH tchar, char * _char) { //获取字节长度 int iLength = WideCharToMultiByte(CP_UTF8, 0, tchar, -1, NULL, 0, NULL, NULL); //将tchar值赋给_char WideCharToMultiByte(CP_UTF8, 0, tchar, -1, _char, iLength, NULL, NULL); } // 多字节转宽字节 __declspec(dllexport) void CharToTChar(char* _char, LPWSTR tchar) { int iLength = MultiByteToWideChar(CP_UTF8, 0, _char, -1, NULL, 0); MultiByteToWideChar(CP_UTF8, 0, _char, -1, tchar, iLength); } __declspec(dllexport) char* GetStr() { setlocale(LC_ALL, "chs"); LPCWCH pTChar = L"好"; char* pChar = new char[50]; memset(pChar, 0, 50); TCharToChar(pTChar, pChar); return pChar; } ## C#代码: class Program { private const string strDllPath = "DllTest.dll"; [DllImport(strDllPath, EntryPoint = "GetStr", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] extern public static IntPtr GetStr(); // 多字节转宽字节 [DllImport(strDllPath, EntryPoint = "CharToTChar", CallingConvention = CallingConvention.Cdecl)] extern public static void CharToTChar(string src, [MarshalAs(UnmanagedType.LPWStr)]string des); // 宽字节转多字节 [DllImport(strDllPath, EntryPoint = "TCharToChar", CallingConvention = CallingConvention.Cdecl)] extern public static void TCharToChar(string src, StringBuilder des); static void Main(string[] args) { IntPtr ptr = GetStr(); string str = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr); bytes = System.Text.Encoding.Default.GetBytes(str); string strResult = System.Text.Encoding.Default.GetString(bytes); Console.WriteLine(strResult); } }
在一行包含英文和中文字符串中,如何判断中文字段??
在一行包含英文和中文字符串中,如何判断中文字段?? 形式如下面所示: ``` DELETE_SUCCESS: '武器事件' + OperateMessage.DELETE_SUCCESS, DELETE_ERROR: '军营事件' + OperateMessage.DELETE_ERROR, ``` 在我读取一行的时候,我想吧中文提取出来,用特定的字符在进行替换,怎么判断武器事件和军营事件,这几个汉字?? 求解决办法,语言node,js,java,c,都可以
如何区分汉字"錒"和其他英文字符
![实验用文档](https://img-ask.csdn.net/upload/201612/08/1481206562_510885.png) 程序所用文档如图,我需要处理这些数据,把它变成 ![预期结果](https://img-ask.csdn.net/upload/201612/08/1481206923_940592.png) 我的代码是这样的 ```cpp #include <iostream> #include <string> #include <fstream> #include <map> #include <cstdlib> using namespace std; bool isLetterOrNumber(const char &word); bool isChinese(const char &word); int main(int argc, char* argv[]) { // 首先要打开这个文件,用二进制形式 ifstream ifs("list_t.txt", ios::binary); // 需要把结果写入一个目标文件 ofstream ofs("hz_pinyin.txt", ios::binary); // 需要一个临时存储字符 char word; // 需要一个字符串存拼音 string pinyin; // 需要一个字符串存汉字 string chinese; // 我们需要通过汉字来检索拼音,所以需要一个从string到string的map map<string, string> table; // 错误处理,如果ifs指向NULL,结束程序 if (!ifs) { cerr << "文件打开错误,请检查" << endl; exit(0); } // 打开文件后看见了下面这一行 // a1 阿啊锕呵吖腌錒 // 文件指针开始移动 while (!ifs.eof()) { // 先读取当前位置的字符 ifs.read((char*)&word, 1); // 判断读到的字符是不是英文字符和数字(因为拼音是由英文字符和数字组成的) if (isLetterOrNumber(word)) // 錒的后一个字节内容是48h,到这一句会判断为真,连入pinyin,造成后面乱码 // 放入pinyin字符串 pinyin += word; // 判断读到的字符是不是中文 else if (isChinese(word)) { // 放入chinese字符串 chinese += word; // 判断中文字符串长度是否为2,如果为2,chinese为索引,pinyin为对应值,存入map if (chinese.size() == 2) { table[chinese] = pinyin; // 以<中文><拼音>形式存入新的文件 ofs.write(chinese.c_str(), chinese.size()); ofs.write(pinyin.c_str(), pinyin.size()); // 接着清空chinese字符串,以迎接下一个汉字 chinese.clear(); // 往目标文件写入一个回车 ofs.write("\r", 1); // 往目标文件写入一个换行 ofs.write("\n", 1); } } // 如果读到了0x0D,那么清空pinyin字符串,并接着读一个0x0A else if (word == 0x0D) { pinyin.clear(); ifs.read((char*)&word, 1); } } ifs.close(); ofs.close(); return 0; } bool isLetterOrNumber(const char &word) { if ((word >= '0' && word <= '9') || (word >= 'a' && word <= 'z') || (word >= 'A' && word <= 'Z')) return true; return false; } bool isChinese(const char &word) { if ((!isLetterOrNumber(word)) && (word != ' ') && (word != '\r') && (word != '\n')) return true; return false; } ``` 生成的结果是乱码。我用winhex查看了一下,问题发生在“錒”这个字上。錒的编码是"E5 48"它第二个字节的48正好是ASCII码中'H'的位置,也就是说,当word是"錒"的第二个字节,并且处理到 ``` cpp if (isLetterOrNumber(word)) ``` 会返回true,这个48就会按照英文来处理,放到拼音字符串中。 但是问题来了:既然"錒"的第二个字节是48,而48也在ASCII中,那么怎么才能区分出我想要的这个48是"錒"的第二字节,而不是'H'ASCII字符? PS:我感觉我的markdown语法好像没有错,为什么代码没有高亮 ![图片说明](https://img-ask.csdn.net/upload/201612/08/1481208269_236469.png)
【C#】菜鸟一枚,有关汉字转拼音的编程问题,谢!
下面粘贴的是书上的源代码,有以下几个问题: 1.asc=M1*256+M2-65536 这个式子是什么含义? 2.为什么计算机内有自己的编码系统,还要自己去定义拼音编码数组和相对应的拼音数组呢? 3.这个编程的思路是怎样的呢? 菜鸟一枚,特别晕菜,希望给予指点。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; namespace ChineseToABC { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("请输入要转换的内容:"); string str = Console.ReadLine(); Regex reg = new Regex("^[\u4e00-\u9fa5]$");//验证输入是否为汉字 byte[] arr = new byte[2];//定义字节数组 string pystr = "";//定义字符串变量并添加引用 char[] mChar = str.ToCharArray();//获取汉字对应的字符数组 Console.WriteLine("转换后的拼音:"+GetStr(mChar, pystr, reg, arr)+"\n");//返回获取到的汉字拼音 } } //定义拼音区编码数组 private static int[] getValue = new int[] { -20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036, -20032,-20026,-20002,-19990,-19986,-19982,-19976,-19805,-19784,-19775,-19774,-19763, -19756,-19751,-19746,-19741,-19739,-19728,-19725,-19715,-19540,-19531,-19525,-19515, -19500,-19484,-19479,-19467,-19289,-19288,-19281,-19275,-19270,-19263,-19261,-19249, -19243,-19242,-19238,-19235,-19227,-19224,-19218,-19212,-19038,-19023,-19018,-19006, -19003,-18996,-18977,-18961,-18952,-18783,-18774,-18773,-18763,-18756,-18741,-18735, -18731,-18722,-18710,-18697,-18696,-18526,-18518,-18501,-18490,-18478,-18463,-18448, -18447,-18446,-18239,-18237,-18231,-18220,-18211,-18201,-18184,-18183, -18181,-18012, -17997,-17988,-17970,-17964,-17961,-17950,-17947,-17931,-17928,-17922,-17759,-17752, -17733,-17730,-17721,-17703,-17701,-17697,-17692,-17683,-17676,-17496,-17487,-17482, -17468,-17454,-17433,-17427,-17417,-17202,-17185,-16983,-16970,-16942,-16915,-16733, -16708,-16706,-16689,-16664,-16657,-16647,-16474,-16470,-16465,-16459,-16452,-16448, -16433,-16429,-16427,-16423,-16419,-16412,-16407,-16403,-16401,-16393,-16220,-16216, -16212,-16205,-16202,-16187,-16180,-16171,-16169,-16158,-16155,-15959,-15958,-15944, -15933,-15920,-15915,-15903,-15889,-15878,-15707,-15701,-15681,-15667,-15661,-15659, -15652,-15640,-15631,-15625,-15454,-15448,-15436,-15435,-15419,-15416,-15408,-15394, -15385,-15377,-15375,-15369,-15363,-15362,-15183,-15180,-15165,-15158,-15153,-15150, -15149,-15144,-15143,-15141,-15140,-15139,-15128,-15121,-15119,-15117,-15110,-15109, -14941,-14937,-14933,-14930,-14929,-14928,-14926,-14922,-14921,-14914,-14908,-14902, -14894,-14889,-14882,-14873,-14871,-14857,-14678,-14674,-14670,-14668,-14663,-14654, -14645,-14630,-14594,-14429,-14407,-14399,-14384,-14379,-14368,-14355,-14353,-14345, -14170,-14159,-14151,-14149,-14145,-14140,-14137,-14135,-14125,-14123,-14122,-14112, -14109,-14099,-14097,-14094,-14092,-14090,-14087,-14083,-13917,-13914,-13910,-13907, -13906,-13905,-13896,-13894,-13878,-13870,-13859,-13847,-13831,-13658,-13611,-13601, -13406,-13404,-13400,-13398,-13395,-13391,-13387,-13383,-13367,-13359,-13356,-13343, -13340,-13329,-13326,-13318,-13147,-13138,-13120,-13107,-13096,-13095,-13091,-13076, -13068,-13063,-13060,-12888,-12875,-12871,-12860,-12858,-12852,-12849,-12838,-12831, -12829,-12812,-12802,-12607,-12597,-12594,-12585,-12556,-12359,-12346,-12320,-12300, -12120,-12099,-12089,-12074,-12067,-12058,-12039,-11867,-11861,-11847,-11831,-11798, -11781,-11604,-11589,-11536,-11358,-11340,-11339,-11324,-11303,-11097,-11077,-11067, -11055,-11052,-11045,-11041,-11038,-11024,-11020,-11019,-11018,-11014,-10838,-10832, -10815,-10800,-10790,-10780,-10764,-10587,-10544,-10533,-10519,-10331,-10329,-10328, -10322,-10315,-10309,-10307,-10296,-10281,-10274,-10270,-10262,-10260,-10256,-10254 }; //定义拼音数组 private static string[] getStr = new string[] { "A","Ai","An","Ang","Ao","Ba","Bai","Ban","Bang","Bao","Bei","Ben", "Beng","Bi","Bian","Biao","Bie","Bin","Bing","Bo","Bu","Ba","Cai","Can", "Cang","Cao","Ce","Ceng","Cha","Chai","Chan","Chang","Chao","Che","Chen","Cheng", "Chi","Chong","Chou","Chu","Chuai","Chuan","Chuang","Chui","Chun","Chuo","Ci","Cong", "Cou","Cu","Cuan","Cui","Cun","Cuo","Da","Dai","Dan","Dang","Dao","De", "Deng","Di","Dian","Diao","Die","Ding","Diu","Dong","Dou","Du","Duan","Dui", "Dun","Duo","E","En","Er","Fa","Fan","Fang","Fei","Fen","Feng","Fo", "Fou","Fu","Ga","Gai","Gan","Gang","Gao","Ge","Gei","Gen","Geng","Gong", "Gou","Gu","Gua","Guai","Guan","Guang","Gui","Gun","Guo","Ha","Hai","Han", "Hang","Hao","He","Hei","Hen","Heng","Hong","Hou","Hu","Hua","Huai","Huan", "Huang","Hui","Hun","Huo","Ji","Jia","Jian","Jiang","Jiao","Jie","Jin","Jing", "Jiong","Jiu","Ju","Juan","Jue","Jun","Ka","Kai","Kan","Kang","Kao","Ke", "Ken","Keng","Kong","Kou","Ku","Kua","Kuai","Kuan","Kuang","Kui","Kun","Kuo", "La","Lai","Lan","Lang","Lao","Le","Lei","Leng","Li","Lia","Lian","Liang", "Liao","Lie","Lin","Ling","Liu","Long","Lou","Lu","Lv","Luan","Lue","Lun", "Luo","Ma","Mai","Man","Mang","Mao","Me","Mei","Men","Meng","Mi","Mian", "Miao","Mie","Min","Ming","Miu","Mo","Mou","Mu","Na","Nai","Nan","Nang", "Nao","Ne","Nei","Nen","Neng","Ni","Nian","Niang","Niao","Nie","Nin","Ning", "Niu","Nong","Nu","Nv","Nuan","Nue","Nuo","O","Ou","Pa","Pai","Pan", "Pang","Pao","Pei","Pen","Peng","Pi","Pian","Piao","Pie","Pin","Ping","Po", "Pu","Qi","Qia","Qian","Qiang","Qiao","Qie","Qin","Qing","Qiong","Qiu","Qu", "Quan","Que","Qun","Ran","Rang","Rao","Re","Ren","Reng","Ri","Rong","Rou", "Ru","Ruan","Rui","Run","Ruo","Sa","Sai","San","Sang","Sao","Se","Sen", "Seng","Sha","Shai","Shan","Shang","Shao","She","Shen","Sheng","Shi","Shou","Shu", "Shua","Shuai","Shuan","Shuang","Shui","Shun","Shuo","Si","Song","Sou","Su","Suan", "Sui","Sun","Suo","Ta","Tai","Tan","Tang","Tao","Te","Teng","Ti","Tian", "Tiao","Tie","Ting","Tong","Tou","Tu","Tuan","Tui","Tun","Tuo","Wa","Wai", "Wan","Wang","Wei","Wen","Weng","Wo","Wu","Xi","Xia","Xian","Xiang","Xiao", "Xie","Xin","Xing","Xiong","Xiu","Xu","Xuan","Xue","Xun","Ya","Yan","Yang", "Yao","Ye","Yi","Yin","Ying","Yo","Yong","You","Yu","Yuan","Yue","Yun", "Za", "Zai","Zan","Zang","Zao","Ze","Zei","Zen","Zeng","Zha","Zhai","Zhan", "Zhang","Zhao","Zhe","Zhen","Zheng","Zhi","Zhong","Zhou","Zhu","Zhua","Zhuai","Zhuan", "Zhuang","Zhui","Zhun","Zhuo","Zi","Zong","Zou","Zu","Zuan","Zui","Zun","Zuo" }; private static string GetStr(char[] mChar, string pystr, Regex reg, byte[] arr) { int asc = 0, M1 = 0, M2 = 0; for (int j = 0; j < mChar.Length; j++) { if (reg.IsMatch(mChar[j].ToString()))//如果输入的是汉字 { arr = System.Text.Encoding.Default.GetBytes(mChar[j].ToString()); M1 = (short)(arr[0]); M2 = (short)(arr[1]); **asc = M1 * 256 + M2 - 65536;** if (asc > 0 && asc < 160) { pystr += mChar[j]; } else { switch (asc) { case -9254: pystr += "Zhen"; break; case -8985: pystr += "Qian"; break; case -5463: pystr += "Jia"; break; case -8274: pystr += "Ge"; break; case -5448: pystr += "Ga"; break; case -5447: pystr += "La"; break; case -4649: pystr += "Chen"; break; case -5436: pystr += "Mao"; break; case -5213: pystr += "Mao"; break; case -3597: pystr += "Die"; break; case -5659: pystr += "Tian"; break; default: for (int i = (getValue.Length - 1); i >= 0; i--) { if (getValue[i] <= asc)//判断汉字的拼音区编码是否在指定范围内 { pystr += getStr[i];//如果不超出范围则获取对应的拼音 break; } } break; } } } else//如果不是汉字 { pystr += mChar[j].ToString();//如果不是汉字则返回 } } return pystr; } } }
c语言数据结构问题 代码相似性度量
我的思路:对要进行比较的所有代码段进行词法分析,并转化为特定的标记(token)串,自己制定一个转换规则。接着,通过两两比较标记(token)串来确定代码之间的相似性,并由此确定代码之间抄袭的程度。 将这两个代码分别转换为token串后,基于算法RKR-GST( running-karp-rabin greedy-string-tiling)算法思想,循环求取两个标记串中未被匹配部分的最大公共子串,将其用空格代替,并根据公式求出两个token串A,B的相似度 源代码 #include <stdio.h> #include <string.h> #include <ctype.h> #include <conio.h> #include <malloc.h> #include <stdlib.h> #include <windows.h> #define N 10000 #define M 10000 #define MAXSTRLEN 10000 //定义最大串长 typedef int status; typedef unsigned char SString[MAXSTRLEN+1]; //串的定长顺序存储表示 SString a[3]={"int","long","short"}; SString b[2]={"float","double"}; SString c[15]={"&&","||","++","--","+","-","*","/","=",">=","<=","==","!=",">","<"}; SString d[12]={"[","]","{","}","(",")",",",";","'","#",";","."}; SString e[29]={"auto","break","case","char","const","continue","default","do","else","enum", "extern","for","goto","if","main","printf","register","return","signed","sizeof", "static","struct","switch","typedef","union","unsigned","void","while","volatile"}; HANDLE hOut; DWORD written; void ShadowWindowLine(char *str); char type(char *str); void token(char name[],char list[],char token[],FILE *table); void simple(int MinMatchLen,FILE *fp1,FILE *fp2); status replace(SString s,int pos,int len,int Ls); int copy(float n); void ShadowWindowLine(char *str) { SMALL_RECT rc; CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口缓冲区信息 WORD att0,att1,attBack; int i, chNum = strlen(str); GetConsoleScreenBufferInfo( hOut, &bInfo ); // 获取窗口缓冲区信息 // 计算显示窗口大小和位置 rc.Left = (bInfo.dwSize.X - chNum)/2 - 2; rc.Top = 8; // 原代码段中此处为bInfo.dwSize.Y/2 - 2,但是如果您的DOS屏幕有垂直滚动条的话,还需要把滚动条下拉才能看到,为了方便就把它改为10 rc.Right = rc.Left + chNum + 4; rc.Bottom = rc.Top + 4; att0 = BACKGROUND_RED |BACKGROUND_BLUE; // 阴影属性 att1 = FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY;// 文本属性 attBack = BACKGROUND_RED |BACKGROUND_GREEN |BACKGROUND_BLUE | BACKGROUND_INTENSITY; // 背景属性 // 设置阴影然后填充 COORD posShadow = {rc.Left+1, rc.Top+1}, posText = {rc.Left, rc.Top},posBack={0,0}; for (i=0;i<25;i++) { FillConsoleOutputAttribute(hOut, attBack,80, posBack, &written); posBack.Y++; } for (i=0; i<5; i++) { FillConsoleOutputAttribute(hOut, att0, chNum + 4, posShadow, &written); posShadow.Y++; } for (i=0;i<5;i++) { FillConsoleOutputAttribute(hOut, att1,chNum + 4, posText, &written); posText.Y++; } // 写文本和边框 posText.X = rc.Left + 2; posText.Y = rc.Top + 2; WriteConsoleOutputCharacter(hOut, str, strlen(str), posText, &written); SetConsoleTextAttribute(hOut, bInfo.wAttributes); // 恢复原来的属性 } char type(char *str) //此函数判断单词类型 { int i; for(i=0;i<3;i++) //a中的关键字 { if(strcmp(str,a[i])==0) return 'K'; } for(i=0;i<2;i++) //b中的关键字 { if(strcmp(str,b[i])==0) return 'E'; } for(i=0;i<15;i++) //c中的符号 { if(strcmp(str,c[i])==0) return 'A'; } for(i=0;i<12;i++) //d中符号 { if(strcmp(str,d[i])==0) return 'R'; } for(i=0;i<29;i++) //e中的关键字 { if(strcmp(str,e[i])==0) return 'Y'; } if(isdigit(str[0])) //0-9是数字 { return 'N'; } //一般的变量与字符 if(!isalnum(str[0])) return 'H'; else return 'C';//变量 } void token(char name[],char list[],char token[],FILE *table) //将两个文件中的字符串分别切割转换为token串 {    FILE *in,*out; char ch,c,buffer[N],*link[M]; int i=0,j=0,k=0,LenLink=0; if((in=fopen(name,"r+"))==NULL) { printf("源文件无法打开!\n"); exit(0); } if((out=fopen(list,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } if((table=fopen(token,"w+"))==NULL) { printf("文件写入失败!\n"); exit(0); } while(!feof(in)) //逐字读取文件 { ch=fgetc(in); if(ch=='\t' || ch==' ' || ch== '\n') //去掉空格、制表符、回车 continue; if(isalpha(ch)) //如果首字符是字母 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); //在文件当中定位 } else if(isdigit(ch)) //如果首字符是数字 { while(isalnum(ch)&&(i<N)) //其他位是字母或数字 { buffer[i++]=ch; ch=fgetc(in); } buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } else if(!isalnum(ch)) //如果首字符既不是数字也不是字母 { if(ch!='\n'&&ch!=' '&&ch!='\t') { if(ch=='>'||ch=='<'||ch=='!') //以下代码实现超前搜索 { if((c=fgetc(in))=='=') //>=,<=,!=这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else if(ch=='+'||ch=='-'||ch=='&'||ch=='|'||ch=='=') { if((c=fgetc(in))==ch) //++,--,&&,||,==这些需被认为是一个符号 { buffer[i++]=ch; buffer[i++]=c; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*3); strcpy(link[j-1],buffer); i=0; } else { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; fseek(in,-1L,1); } } else //其他符号 { buffer[i++]=ch; buffer[i]='\0'; link[j++]=(char *)malloc(sizeof(char)*2); strcpy(link[j-1],buffer); i=0; } } } } LenLink = j-1; //存到link中的总长度 for(i=0;i<LenLink;i++) //打印token中的内容 { c=type(link[i]); // if(c=='N'||c=='A'||c=='R')//数字,符号在表中保留 fputs(link[i],table); if(c=='C') //变量均替换为id fputs("id",table); if(c=='K')//关键字int,short,long替换为zh fputs("zh",table); if(c=='E')//关键字float,double替换为fu fputs("fu",table); if(c=='Y')//其他关键字不变 fputs(link[i],table); if(c=='H')//汉字删掉 fputs("\0",table); } fclose(table); fprintf(out,"\t***** 单词类型观察表 *****\n");//打印list中的内容 fprintf(out,"\t K --int,short,long \n"); fprintf(out,"\t E --float,double\n"); fprintf(out,"\t Y --其他关键字\n"); fprintf(out,"\t A --运算符号\n"); fprintf(out,"\t R --语言符号\n"); fprintf(out,"\t N --数字\n"); fprintf(out,"\t H --汉字\n"); fprintf(out,"\t C --一般变量或标识符\n"); fprintf(out,"\t*****************************\n"); for(i=0;i<LenLink;i++) { c=type(link[i]); //判断单词的类型 fputc('(',out); fputc(c,out); fputc(',',out); fputs(link[i],out); fputc(',',out); fprintf(out,"%d",i); fputc(')',out); fputc('\n',out); } } void simple(int MinMatchLen,FILE *fp1,FILE *fp2)//此函数计算相似度,MinMatchLen: 公共子串要达到的最小长度 { SString A,B; char ch,h; int i=0,j=0,k,t,s,a=1,La,Lb,lena,lenb,x,y; float n; int MatchLen=0;//所有公共子串的总长度 int maxmatch;//当前最大公共子串长度 if ((fp1=fopen("f:\\token1.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } A[++i]=fgetc(fp1); while(!feof(fp1)) A[++i]=fgetc(fp1); fclose(fp1); La=i-1; printf("token串1长度为%d,",La); if ((fp2=fopen("f:\\token2.txt","r"))==NULL)//设定文件位于当前目录下,可更改为绝对路径 { printf("文件打开失败!"); getch(); exit(0); } B[++j]=fgetc(fp2); while(!feof(fp2)) B[++j]=fgetc(fp2); fclose(fp2); Lb=j-1; printf("token串2长度为%d\n",Lb); printf("是否要查看这两个token串?Y/N "); h=getchar(); if(h=='Y'||h=='y') { ShellExecute(NULL,"open","F:\\token1.txt",NULL,NULL,SW_SHOWNORMAL); ShellExecute(NULL,"open","F:\\token2.txt",NULL,NULL,SW_SHOWNORMAL); } getchar(); printf("\n将超过指定长度的公共子串用空格替换,是否要查看细节?Y/N "); ch=getchar(); lena=i-1; lenb=j-1; do { maxmatch=MinMatchLen; for(i=1;i<=La;i++) { for(j=1;j<=Lb;j++) { k=0; while((k<=La-i)&&(k<=Lb-j)&&(A[i+k]==B[j+k])&&((A[i+k]!='\0')||(B[j+k]!='\0'))&&(A[i+k]!=' ')&&(B[j+k]!=' ')) //串A的第i+k个字符与串B的第j+k个字符是否相等 k++; if(k>maxmatch) { maxmatch=k; x=i; y=j; } } } if(maxmatch>MinMatchLen) { replace(A,x,maxmatch,La); replace(B,y,maxmatch,Lb); La=La-maxmatch+1; Lb=Lb-maxmatch+1; MatchLen+=maxmatch; } if(ch=='Y'||ch=='y') { printf("第%d次检查两串中的匹配串\n",a); a++; for(s=1;s<=La;s++) printf("%c",A[s]); printf("\n"); for(s=1;s<=Lb;s++) printf("%c",B[s]); printf("\n"); } } while(maxmatch>MinMatchLen); printf("\n已经没有能够匹配的公共子串了\n"); n=(2.0*MatchLen)/(lena+lenb); printf("公共子串的总长为%d,",MatchLen); printf("根据公式\n"); printf("\t\t ——————————————————————————\n"); printf("\t\t| 相似度=(2×公共子串长度)÷(串A长度+串B长度) |\n"); printf("\t\t ——————————————————————————\n"); printf("这两串代码的相似度为%f\n",n); copy(n); } status replace(SString s,int pos,int len,int Ls) //用空格来代替两个token串中的最大匹配子串 { int i; if(pos<1||pos>Ls-len+1||len<0) return 0; s[pos]=' '; for(i=pos+len;i<=Ls;i++) { s[i-len+1]=s[i]; } return 1; } int copy(float n) //此函数判断是否抄袭 { printf("\n相似度超过0.8,则认为是抄袭"); if(n>=0.8) printf("\n这两个代码有抄袭嫌疑,请做进一步检查"); else printf("\n这两个代码没有抄袭嫌疑"); return 0; } void main(void) { hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄 SetConsoleOutputCP(936); // 设置代码页,此为中文简体 ShadowWindowLine(" 欢迎使用C语言代码复制/相似度检测软件 "); getchar(); system("cls"); //清屏 char name1[50]; char name2[50]; //存储输入的文件路径字符串 FILE *f1,*f2; system("color F3"); printf("\n代码1:"); scanf("%s",name1); token(name1,"f:\\list1.txt","f:\\token1.txt",f1); printf("代码2:"); scanf("%s",name2); token(name2,"f:\\list2.txt","f:\\token2.txt",f2); printf("\ntoken串已生成成功,"); getchar(); simple(3,f1,f2); }
C程序内存不能为read错误,包含文件和内存操作
各个方法每个都没问题,放一块儿就冒出个不明原因的错误 ```C #include <stdio.h> #include <math.h> #include <time.h> //get time difference //days from 2015/6/9 to here. int getTD(); //free()! char* getTextFileContent(char*); long getFileSize(FILE*); //free()! char* mStrCat(char*, char*); int main() { int TD = getTD() + 1; char buf[100]; getcwd(buf, 100); char *listPath = mStrCat(buf, "\\plan.txt"); //DEBUG printf("%s\r\n", listPath); char* text = getTextFileContent(listPath); free(listPath); printf("%s", text); text = (text == NULL) ? "" : text; system("cls"); printf("高考后第[ %d ]天\r\n", TD); printf("Tasks:\r\n %s\r\n", text); system("pause & exit"); free(text); return 0; } int getTD() { struct tm tmptm = {0, 0, 0, 9, 5, 2015 - 1900}; long startT = mktime(&tmptm); long nowT = time(NULL); //seconds long TDs = nowT - startT; //days double TDd = (double)TDs; TDd = TDd / (60 * 60 * 24); TDd = floor(TDd); return (int)TDd; } char* getTextFileContent(char *path) { FILE *fp = fopen(path, "r"); if(fp == NULL) return NULL; long size = getFileSize(fp); int chLen = sizeof('\0'); char *ptr = (char*)malloc(size + chLen); //block 作为这块内存区的起始指针将被作为字符串指针返回,ptr 经过运算后将指向内存区结尾。 char *block = ptr; if(ptr == NULL) { return NULL; } int c; char ch; //依次将fgetc 获得的字符填入内存区。 while((c = fgetc(fp)) != EOF) { ch = (char) c; memcpy(ptr, &ch, chLen); //移动ptr 到下一个待填入的地址。 (int)ptr += chLen; } char endC = '\0'; memcpy(ptr, &endC, chLen); return block; } long getFileSize(FILE* f) { long size = (fseek(f, 0L, SEEK_END) != 0) ? (ftell(f)) : -1; rewind(f); return size; } char* mStrCat(char *str1, char *str2) { int str1Len = strlen(str1) + 1; int str2Len = strlen(str2) + 1; int byteNum = (str1Len + str2Len - 1) * sizeof(char); char *block = (char*)(malloc(byteNum)); if(block == NULL) return NULL; memmove(block, str1, str1Len * sizeof(char)); strcat(block, str2); return block; } ``` 文件内容可以正常输出,说明文件读取的部分大概没问题,mStrCat 经测试也没发现问题,但程序死活执行不到 system("cls") ,一到这儿Windows就会弹窗提示。 ![图片说明](https://img-ask.csdn.net/upload/201507/02/1435770423_486685.png) 文件内容可以正常输出: ![图片说明](https://img-ask.csdn.net/upload/201507/02/1435770417_925756.png) 另外,运行程序的时候360报毒了,一个QVM。。。,然后运行几次之后那个cmd窗口无法关闭了(点什么都没反映,但光标在闪)。打开的任务管理器也变成了这样: ![图片说明](https://img-ask.csdn.net/upload/201507/02/1435770593_655782.png) 自然,没能杀掉cmd,最后连资源管理器都不正常了,通过重启解决。(一个小练习而已杀伤力没这么大吧) P.S. 通过TCC 编译 ----------------------------------------------- 改动后的getTextFileContent 代码:(实际上没什么改动,但至少能用了) ``` char* getTextFileContent(char *path) { FILE *fp = fopen(path, "r"); if(fp == NULL) return NULL; long size = getFileSize(fp); int chLen = sizeof(char); char *ptr = (char*)malloc(size + chLen); char *block = ptr; if(ptr == NULL) { return NULL; } int c; char ch; while((c = fgetc(fp)) != EOF) { ch = (char)c; memcpy(ptr, &ch, chLen); ptr += chLen; } ch = '\0'; memcpy(ptr, &ch, chLen); fclose(fp); return block; } ``` 文件大小为275b 时读取汉字都没问题(I don't know why ...),但到1.27k(全英文)时就又冒出了内存不能为written 错误,一瞬间想到当初在Android 上写的个文件复制程序会不时的冒出Segmentation Fault…… 哪位大神来搭救一下!
java根据模板修改内容后,生成word,修改后内容中文乱码
Java code package com.sunyard.test; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; public class OperatorRTF { /** * 字符串转换为rtf编码 * * @param content * @return */ public String strToRtf(String content) { try { System.out.println(content); content=new String(content.getBytes(),"GB2312"); System.out.println(content); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = null; bs = content.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("\\'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } return sb.toString(); } /** * 替换文档的可变部分 * * @param content * @param replacecontent * @param flag * @return */ public String replaceRTF(String content, String replacecontent, int flag) { String rc = strToRtf(replacecontent); String target = ""; System.out.println(rc); if (flag == 0) { target = content.replace("$timetop$", rc); } if (flag == 1) { target = content.replace("$info$", rc); } if (flag == 2) { target = content.replace("$idea$", rc); } if (flag == 3) { target = content.replace("$advice$", rc); } if (flag == 4) { target = content.replace("$infosend$", rc); } return target; } /** * 获取文件路径 * * @param flag * @return */ public String getSavePath() { String path = "D:\\"; File fDirecotry = new File(path); if (!fDirecotry.exists()) { fDirecotry.mkdirs(); } return path; } /** * 半角转为全角 */ public String ToSBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 32) { c[i] = (char) 12288; continue; } if (c[i] < 127) { c[i] = (char) (c[i] + 65248); } } return new String(c); } public void rgModel(String username, String content) { /* 构建生成文件名 targetname:12时10分23秒_username_记录.rtf */ Date current = new Date(); SimpleDateFormat sdf = new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String targetname = sdf.format(current).substring(11, 13) + "时"; targetname += sdf.format(current).substring(14, 16) + "分"; targetname += sdf.format(current).substring(17, 19) + "秒"; targetname += "_" + username + "_记录.doc"; /* 字节形式读取模板文件内容,将结果转为字符串 */ String strpath = getSavePath(); String sourname = strpath + "\\" + "档案利用登记单.rtf"; String sourcecontent = ""; InputStream ins = null; try { ins = new FileInputStream(sourname); byte[] b = new byte[1024]; if (ins == null) { System.out.println("源模板文件不存在"); } int bytesRead = 0; while (true) { bytesRead = ins.read(b, 0, 1024); // return final read bytes // counts if (bytesRead == -1) {// end of InputStream System.out.println("读取模板文件结束"); break; } // convert to string using bytes sourcecontent += new String(b, 0, bytesRead); } } catch (Exception e) { e.printStackTrace(); } /* 修改变化部分 */ String targetcontent = ""; /** * 拆分之后的数组元素与模板中的标识符对应关系 array[0]:timetop array[1]:info array[2]:idea * array[3]:advice array[4]:infosend */ String array[] = content.split("~"); // 2008年11月27日:更新模板之后时间无需自动填充 for (int i = 0; i < array.length; i++) { if (i == 0) { targetcontent = replaceRTF(sourcecontent, array[i], i); } else { targetcontent = replaceRTF(targetcontent, array[i], i); } } /* 结果输出保存到文件 */ try { FileWriter fw = new FileWriter(getSavePath() + "\\" + targetname, true); PrintWriter out = new PrintWriter(fw); System.out.println(targetcontent); if (targetcontent.equals("") || targetcontent == "") { out.println(sourcecontent); } else { out.println(targetcontent); } out.close(); fw.close(); System.out.println(getSavePath() + " 该目录下生成文件" + targetname + " 成功"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { OperatorRTF oRTF = new OperatorRTF(); // 被替换内容以"~"符号分割,处理的时候将其拆分为数组即可 String content = "2008Y10M12D9H-2008Y10M12D6H~idea~look~我们参照检验药品的方法~we"; oRTF.rgModel("cheney", content); } } 上面的代码是我在网上找到的一种java操作word的方法 java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。 ----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。 ----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。 1、采用字节的形式读取rtf模板内容 2、将可变的内容字符串转为rtf编码 3、替换原文中的可变部分,形成新的rtf文档 这是原作者的想法,可我在使用过程中,发现替换内容中(我们参照检验药品的方法)这个中文,是不能显示的,在word里,把它转换成了iso-8859-1的编码了,不能正常显示中文,我都不知道应该在哪设置编码,才能让它正常显示,原word模板中的中文,可以正常显示,应该是在读取word模板的时候,把编码方式也读进去了,现在就是想请教一下前辈们,应该如何后,自己修改的那些中文,也可以正常显示呢 [b]问题补充:[/b] 汗,这里好象自己不能回复,所以我以这种形式回复。 先感谢一楼,二楼的回答,昨天我有事,请假没上班,所以没能及时回复,先道个歉。 先回答1楼的,在写的时候,我设置编码的话,感觉是无效的,不管我怎么设置,都没用。 再回答2楼的,特别说一下,我试了一下,发现生成的word里,那些修改部分的中文的编码形式改变了,只是还是乱码。后来我把unicode,ISO-8859-1,UTF-8,GB2312,GBK,甚至ASCII都试过了, word里都是不同形式的乱码,就是不出现汉字,真闷,我感觉是在 bs = content.getBytes("unicode"); 后,系统后来又默认的把这把转成了ISO-8859-1的形式. 可是 bs = content.getBytes("ISO-8859-1"); 我这么设置,word里的汉字是????? 真不知道为什么,要是ISO-8859-1,转ISO-8859-1,应该不会改变的哎 希望高手们,能继续解答,谢谢 [b]问题补充:[/b] 汪兆铭,您好,我不知道您一直观注这个问题,我以为要过会才能看到您的回答,所以,现在才刷新了这个页面,不好意思,先道个歉。 现在回到问题中,我照您的意思, bs = content.getBytes("unicode"); 改了一下,然后输入,可是依然不能正常显示中文,是不是,在哪,还需要再转换一次呢? [b]问题补充:[/b] mirzlm@126.com 谢谢,不知道与jdk版本或是什么的没有关系 [b]问题补充:[/b] 汪兆铭,您好,我看了一下您发的东西,我发现了问题的所在,竟然是在表格单元格里面的,就替换出来的是乱码,在表格单元格外面的,是可以正常显示的,您可以去试试,把替换的那个,放在表格里,看看,会不会成功,谢谢你的帮助 [b]问题补充:[/b] 谢谢您,给我这么多的帮助,那应该是我的那个rtf模板的问题了,真的很感谢,谢谢,谢谢,再谢谢
android的edittext输入内容控制问题
效果见图,我想要实现模版名下的EditText输入内容的控制,只允许输入a-z A-Z 0-9 分号; 和汉字。以下是我自己的代码,都不能完全实现或是报错。求大神点拨 图片弄不上来,其实布局很简单,就是一个edittext和一个Button, 实现了edittext的输入要求,Button就可见并触发跳转事件 public class MainActivity extends Activity { private static String tag = "MainActivity"; private Button btn; private EditText edt, content; private final int[] code = { 8, 13, 32, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 186 }; private String digits = "0123456789abcdefghijklmnopqrstuvwxyz;"; private String tmp; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn_edit); btn.setEnabled(false); edt = (EditText) findViewById(R.id.edt); edt.addTextChangedListener(edt_watcher); // edt.setOnKeyListener(input); btn.setOnClickListener(l); } //我的思路一:键盘监听事件,监听keyCode是否在允许的按键集合中, //但会出现如果我一按不在集合中的就会刷新之前已经输入过的内容 OnKeyListener input = new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub for (int i = 0; i < code.length; i++) { if (keyCode != code) { edt.setText(tmp); edt.invalidate(); } } return false; } }; //我的思路二:文本输入监听,在监听判断后我先获取到edt.gettext然后进行一个拼接处理,然后再设置回edittext的内容中 //会出现每次输入符合的字符会在左边添加,光标始终在最左边。 在处理上有问题, 看看这里能给出处理意见 // 文本输入监听 TextWatcher edt_watcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String str = s.toString(); String edttext = edt.getText().toString(); StringBuffer sb = new StringBuffer(); // TODO Auto-generated method stub if (s.length() > 0 && str.matches("[a-zA-Z_0-9;]+") || str.matches("[\u4e00-\u9fa5]+")) { sb = sb.append(s); edt.setText(sb.toString()); Log.v(tag, sb.toString()+"======sb"); btn.setEnabled(true); } else { edttext = sb.append(tmp).toString(); Log.v(tag, edttext + "======edttext"); edt.setText(edttext); tmp = str.substring(0,s.toString().length()-2); edt.setText(tmp); btn.setEnabled(false); } Log.v(tag, s + "======s"); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.v(tag, s + "======beforeTextChanged"); } //我的思路三:如下注释部分,但这里需要实现digits里包含所有的汉字,这里不知道怎么去弄 @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub Log.v(tag, s + "======afterTextChanged"); /*String str = s.toString(); if (str.equals(tmp)) { return; // 如果tmp==str则返回,因为这是我们设置的结果。否则会形成死循环。 } StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++) { if (digits.indexOf(str.charAt(i)) >= 0) { // 判断字符是否在可以输入的字符串中 sb.append(str.charAt(i)); // 如果是,就添加到结果里,否则跳过 } tmp = sb.toString();// 设置tmp,因为下面一句还会导致该事件被触发 edt.setText(tmp);// 设置结果 edt.invalidate(); } if ((str.matches("[a-zA-Z_0-9;]+") || str .matches("[\u4e00-\u9fa5]+"))) { sb.toString().substring(str.length()); } tmp = sb.toString(); edt.setText(tmp); edt.invalidate();*/ } }; //判断输入的是不是汉字,没有用上的方法 private boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { String edttext = edt.getText().toString(); StringBuffer sb = new StringBuffer(edttext); sb.append(c); edt.setText(sb); return true; } return false; } //判断是不是字母或者数字,分号,没有用上的方法, private boolean isRightData(CharSequence s) { if (s.toString().matches("[0-9;]+") || s.toString().matches("[a-zA-Z]+")) { String edttext = edt.getText().toString(); StringBuffer sb = new StringBuffer(edttext); sb.append(s); edt.setText(sb); edt.invalidate(); return true; } return false; } OnClickListener l = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, IldmActivity.class); intent.putExtra("edt", edt.getText().toString()); startActivityForResult(intent, 10); Log.v(tag, edt.getText() + "intent"); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 10 && resultCode == RESULT_OK) { } }; }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
ES6基础-ES6的扩展
进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符串的扩展: 模板字符串,部分新的方法,新的unicode表示和遍历方法: 部分新的字符串方法 padStart,padEnd,repeat,startsWith,endsWith,includes 字...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Qt实践录:开篇
本系列文章介绍笔者的Qt实践之路。
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
一条链接即可让黑客跟踪你的位置! | Seeker工具使用
搬运自:冰崖的部落阁(icecliffsnet) 严正声明:本文仅限于技术讨论,严禁用于其他用途。 请遵守相对应法律规则,禁止用作违法途径,出事后果自负! 上次写的防社工文章里边提到的gps定位信息(如何防止自己被社工或人肉) 除了主动收集他人位置信息以外,我们还可以进行被动收集 (没有技术含量) Seeker作为一款高精度地理位置跟踪工具,同时也是社交工程学(社会工程学)爱好者...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
[Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势
思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。第一篇文章将分享腾讯疫情实时数据抓取,获取全国各地和贵州省各地区的实时数据,并将数据存储至本地,最后调用Maplotlib和Seaborn绘制中国各地区、贵州省各城市、新增人数的图形。希望这篇可视化分析文章对您有所帮助!
小白也会用的情人节表白神器
鉴于情人节女朋友总说直男,上网找了个模板,改了一下,发现效果还不错。然后又录了一个视频,发现凑合,能用。现在免费分享给程序员,去表白去吧。​​​​​​。当然比较low因为考研没时间优化,懒着优化了。 先看一下效果吧:页面太多了,这里我只放几个页面里面有音乐,还凑合不是太单调。 所有页面最后的合成效果: 接下来教大家如何使用: 新建文件夹:love 然后建立这几个...
论如何用python发qq消息轰炸虐狗好友
因为我的某个好友在情人节的时候秀恩爱,所以我灵光一闪制作了qq消息轰炸并记录了下来。 首先 我的编程环境是: windows 10系统 python3.6 记得要下载win32 pip install win32 思路介绍 其实也非常简单 将要发出去的句子储存在列表中 然后用随机模块调用 将随机出来的元素储存在剪贴板中 连接QQ 找到指定对象 疯狂输出 怎么样,简单吧 开始打代码吧 imp...
情人节闲着无聊写个python程序
用python在图片上写字 ''' 依赖,需要安装Pillow pip install Pillow ''' from PIL import Image, ImageDraw, ImageFont import sys #判断参数个数,可以不要 import os #判断文件是否存在,可以不要 image_path = "1.jpg" font_path = "SIMLI.TTF" tex...
前端 HTML5+CSS3基础知识一 睡觉没前途( ̄o ̄) . z Z 快来学习
目录 CSS3有哪些新特性? html5\CSS3有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 本地存储(Local Storage )和cookies(储存在用户本地终端上的数据)之间的区别是什么? 如何实现浏览器内多个标签页之间的通信? 你如何对网站的文件和资源进行优化? 什么是响应式设计? 新的 HTML5 文档类型和字符集是...
2020程序员面试必备!58道精选面试题,这样学习,大厂没问题!
面试题目: 1-10题: 1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、Serializable 和Parcelable 的区别 8、静态属性和静态方法是否可以被...
新型冠状病毒,疫情实时追踪。
说来惭愧,享受CSND的帮助已经16年了,却从来没有为他人做过贡献。今天开始本人将坚持在CSDN发布个人技术文章,为自己巩固理解、也为他人排忧解难。 最近,新型冠状病毒的实时疫情一直牵动着每个人的心,作为一名程序员在这非常时期希望能通过技术手段为大家提供实时的调情播报。 项目名称:新型冠状病毒,疫情实时追踪 技术标签:Html5、Css、JavaScript、Jquery、Ajax、Echa...
在三线城市工作爽吗?
我是一名程序员,从正值青春年华的 24 岁回到三线城市洛阳工作,至今已经 6 年有余。一不小心又暴露了自己的实际年龄,但老读者都知道,我驻颜有术,上次去看房子,业务员肯定地说:“小哥肯定比我小,我今年还不到 24。”我只好强颜欢笑:“你说得对。” 从我拥有记忆到现在进入而立之年,我觉得,我做过最明智的选择有下面三个: 1)高中三年,和一位女同学保持着算不上朋友的冷淡关系;大学半年,把这位女同学追到...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问