c语言字符串文库总结,C语言字符串.ppt

253b171540df25e1b84436cbe50dfc72.gifC语言字符串.ppt

ACM程序设计,福州大学至诚学院 冯新,第四讲,字符串处理,常用函数介绍,复制,char* strcpy char *s1, const char *s2; 将字符串s2复制到s1指定的地址 char* strncpy char *s1, const char *s2, size_t len; 将s2的前len个字符字节复制到s1中指定的地址, 不加0,连接,char* strcat char *s1, const char *s2; 将字符串s2连接到s1尾部 char* strncat char *s1, const char *s2, size_t len; 将字符串s2的前len个字符连接到s1尾部, 不加0,比较,int strcmp const char *s1, const char *s2; 比较字符串s1和s2 int strncmp const char *s1, const char *s2, size_t len; 对s1和s2的前len个字符字节作比较,查找,char* strchr const char *s, int ch; 在s中查找给定字符字节值ch第一次出现的位置 char* strrchr const char *s, int ch; 在串s中查找给定字符ch最后一次出现的位置, r表示从串尾开始 char* strstr const char *s1, const char *s2; 在串s1中查找指定字符串s2第一次出现的位置,其他,size_t strlen const char *s; 求字符串s的长度,字符转换,所谓字符转换就是将字符按照某种规律转换成对应的字符,曾经最难的问题(HDU 1048),题目描述 恺撒大帝生活在充满危险和阴谋的时代。恺撤大帝面临最严峻的形势就是如何生存下去,为了生存,他决定设计一种密码。这种密码设计得是如此难以置信的合理,以至于不知道它的原理就无法破译。 你是恺撒军队的一个小队长。你的工作就是对恺撒发布的密文进行解码,然后告诉军头的司令官。加密的规则其实很简单对原文中的每个字母,转换成字母表后面第5个字母,如原文中的字符为字母A,则密文中对应的字符为F。因为你的工作是解码,所以要将密文文翻译成原文。 ciphertext密文ABCDEFGHIJKLMNOPQRSTUVWXYZ plaintext 原文VWXYZABCDEFGHIJKLMNOPQRSTU 加密时,只有字母字符才按照上述规则进行加密。任何非字母字符保持不变,而且所有享母字符均为大写字母。输入数据 输入文件(非空)最多包含100组数据。每组数据为下面的格式,每组数据之间没有空行,所有的字符为大写。 每组数据由3行组成 1首行为字符串START; 2第2行为密文,包含的字符个数大于等于1,小于等于200,表示恺撒发布的密文; 3第3行为字符串END。 最后一组数据后有ENDOF,表示输入结束。 输出描述 对每组数据,输出一行,为你解密出来的原文。,输入数据 输入文件(非空)最多包含100组数据。每组数据为下面的格式,每组数据之间没有空行,所有的字符为大写。 每组数据由3行组成 1首行为字符串START; 2第2行为密文,包含的字符个数大于等于1,小于等于200,表示恺撒发布的密文; 3第3行为字符串END。 最后一组数据后有ENDOF,表示输入结束。 输出描述 对每组数据,输出一行,为你解密出来的原文。 Sample START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOF Sample Output IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE题目分析,分析本题针对的大写字母,把每个字母转换成字母表前5个字母,形成环状序列。F转换成AG转换成BZ转换成U,A、B、C、D、E分别转换成V、W、X、Y、Z。 转换公式 ai ai-5-652665; 或者 ai ai21-652665;温馨提示 A在ASCII码中是65本题还要特别注意输入数据的格式,每组数据占3行,但只有中间一行是需要处理的,在读人数据时要跳过第1行和第3行。另外,输入数据结束“ENDOF”为标志的。,whilegetsa ifstrcmpa, “ENDOF“ 0 break; getsa; int i 0; whileai 0 ifai A ,include include int main char a210; whilegetsa ifstrcmpa, “ENDOF“ 0 break; getsa; int i 0; whileai 0 ifai A ,字符编码,所谓字符编码就是将字符串中的每个字符按照编码规则转换成一个数字或一串数字或者将字符串中具有某种规律的子串转换成一串数字或其他字符等。,Soundex(ZJU 1858),Soundex编码方法根据单词的拼写将单词进行分组,使得同一组的单词发音很接近。例如,“can”与“khawn”,“con”与“gone”在Soundex编码下是相同的。 Soundex编码方法将每个单词转换成一串数字,每个数字代表一个字母。规则如下 1代表B,F,P或V; 2代表C,G,J,K,Q,S,X或Z; 3代表D或T; 4代表L; 5代表M或N; 6代表R。 而字母A,E,I,O,U,H,W和Y不用任何数字编码,并且相邻的、具有相同编码值的字母只用一个对应的数字代表。具有相同Soundex编码值的单词被认为是相同的单词。输入描述 输入文件中的每行为一个单词,单词中的字母都是大写,每个单词长度不超过20个字母。 输出描述 对输入文件中的每个单词,输出一行,为该单词的Soundex编码。 样例输入 样例输出 KHAWN 25 PFISTER 1236 BOBBY 11,题目分析,比如样例输入中的第一个单词”KHAWN”,它的Soundex编码值之所以是“25”,是因为第一个字母“K”的编码值为“2”,而接下来的三个字母“H”、“A”和“W”都没有编码值,最后一个字母“N”的编码值为“5”。样例输入中的最后一个单词“BOBBY”,它的Soundex编码值之所以是“11”,是因为第一个字母。“B”的编码值为“1”,第2个字母“O”没有编码值,之后两个字母“B”相邻,只编码成一个“1”,最后一个字母“Y”没有编码值。 从上面的分析可以看出,题目中提到的“相邻的、具有相同编码值的字母只用一个对应的数字代表”,如果具有相同编码值的字母之间间隔了若干个没有编码值的字母,则要单独编码。例如BB编码成“l”,“BV”也编码成“1”,而“BOB”编码成“11”。本题在处理时可以把26个字符的编码值(数字字符)按顺序存放到一个字符数组中,对没有编码值的字符,用“*”号表示。然后对字符串中的每个字符,输出其对应的数字;如果后一个字母的编码值跟前一个字母的编码值一样,则后一个字母的编码值不输出。,include include int main char change27 “*123*1222455*12623*1*2*2“; char 21; int i; whilescanf“s“, EOF int len; char temp; char prev 0; len strlen; fori 0; i len; i temp changei-A; iftemp * prev 0; continue; if temp prev continue; printf“c“, temp; prev temp; printf“n“; return 0; ,回文的判断与处理,所谓回文palindrome字符串,就是从左向右读和从右向左读结果相同的字符串。回文的判断与处理经常出现在ACM/ICPC题目中。判断回文的方法很简单,假设字符串长度为n,只需依次判断字符串中第i个字符与第n-l-i个字符是否相等即可,i0,1,2,3n/2。,int huiwenchar *s char *p1, *p2; int i, t 1; p1 s; p2 sstrlens-1; fori 0; i strlens/2; i if*p1 *p2 t 0; break; p1; p2; return t; ,子串处理,字符串中任意一个连续的字符组成的字符序列被称为该字符串的子串。有时,从字符串中抽取不连续的字符所组成的字符序列,也可以看成是字符串的子串。 需要说明的是,子串处理中的问题大多都属于子串匹配的问题,其中涉及的算法(如KMP算法)比较复杂,我们不在这里进行讨论。,字符串的包含问题(ZJU 1970),题目描述 给定两个字符串s和t,判断s是否是t的子串,也就是说,是否能通过从t中去掉一些字符,使得剩余的字符构成的字符串为s。 输入描述 输入文件包含多个测试数据,每个测试数据占一行,为两个字符串s和t,这两个字符串是由大小写字母字符构成的,两个字符串之间用空格隔开。输人数据一直到文件尾。 输出描述 对输入文件中的每个测试数据,判断s是否为t的子串。 样例输入 样例输出 person compression No VERDI vivaVittorioEmanueleReDiltalia Yes,题目分析,对字符串s的第0个字符s0,在字符串t中进行查找,假设查找到,其第一次出现的位置为t0;在字符串t的t0下一个位置继续查找s1,假设查找到,其(第一次出现的)位置为t1l;在字符串t的t1下一个位置继续查找s2。如果都能查找到s中的每个字符,则s是t的“子串”;否则如果s中后面某些字符在t中没有找到对应的字符,则s不是t的“子串”。 例如,对样例输入中的第1个测试数据,按照上述方式在字符串t中查找到字符串s中的前两个字符s0和s1后,后面的4个字符没能在t中查找到,所以s不是t的“子串”。相反,在第2个测试数据中,在t中都能查找到s中的每个字符,所以s是t的“子串”。,char s1000000; char t1000000; int main long ls, lt; long ps, pt; whilescanf“s s“, s, t EOF ls strlens; lt strlent; forps pt 0; ps ls ,Thank You ,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值