[OJ] C语言赐予你的字符串处理函数
February 6, 2021
C语言赐予你的字符串处理函数
string.h库中包含一系列处理字符串常用的函数,来看看吧。
阅览过string.h的函数列表后,以后遇到类似的字符串处理问题,就可以先查查这个表,看看有没有能直接使用的函数。
用字符串函数来解题!
获取字符串长度 -> strlen()
关键点:题目的单词要么是“click”要么是“double click”,因此没有必要真正去解析词语,只需要运用字符串的长度关系,直接计算出“click”出现次数即可。
SOJ1409 双击666 AC.c
s[];main(n){gets(&n);strchr(gets(s),'d')?puts("666"):printf("%d",strlen(s)/6+1);}
实际上,这道题的“click”出现次数也可以不计算。
s[];main(n){gets(&n);puts(strchr(gets(s),'d')?"666":&n);}
比较字符串 -> strcmp()
该函数返回值为int, 分为3种情况.
1. 字符串相等: 返回 0
2. 字符串str1 < 字符串str2: 返回负数
3. 字符串str1 > 字符串str2: 返回正数
连接字符串 -> strcat()
将src字符串 连接到 dest字符串的末尾(请保证dest字符串拥有足够的大小)
strcat(A, B) = A + B
找出首个不满足字符集的下标 -> strspn()
该函数用于在str1中找出 第一个不在str2中出现的字符的下标
SOJ1082 字符串 AC.c
char s[];main(t){t=strspn(gets(s),"#");for(printf("%s",s+t);t--;putchar(35));}
大小写转换 -> strupr() & strlwr()
注意: strupr()和strlwr()并不是string.h的函数
SOJ1279 转换为大写 AC.c
main(n){puts(strupr(gets(&n)));}
SOJ1290 转换为小写 AC.c
main(n){puts(strlwr(gets(&n)));}
反转字符串 -> strrev()
注意: 该方法是原址性的, 如果需要保留原始字符串, 则应该事先用strcpy()复制一份原始字符串的副本.
SOJ1284 字符串正反连接 AC.c
s[];S[];main(){gets(s);printf("%s%s",s,strrev(strcpy(S,s)));}
SOJ1305 判断是否为对称字符串 AC.c
s1[];s2[];main(){puts(strcmp(s1,strrev(strcpy(s2,gets(s1))))?"No":"Yes");}
SOJ1615 英语单词逆序 AC.c
m[];main(){for(;~scanf("%s",&m);printf("%s ",strrev(m)));}
找出指定字符的出现下标 -> strchr()
注意: 该方法返回的是 首个符合的字符的指针(char*), 因此,如果需要算出该字符在原字符串中的下标, 应该运用指针算术来得到:
index = strchr(str, 指定字符) – str
SOJ1336 我已经不是三岁小孩了 AC.c
s[];main(N,M){gets(s);N=*(strchr(s,45)-1)%48;M=*(strchr(s,45)+1)%48;puts(4>=N&&4<=M?"Yes":"No");}
SOJ1604 英语姓名简写 AC.c
m[];main(){*strrchr(gets(m),46)=0;puts(m);}
连接部分字符串 -> strncat()
比较部分字符串 -> strncmp()
复制字符串 -> strcpy()
复制部分字符串 -> strncpy()
检索开头有几个字符不符合条件 -> strnspn()
检索第一个匹配指定字符列表的字符 -> strpbrk()
注意: strpbrk() 与 strspn() 相反.
找出指定字符最后一次出现的位置 -> strrchr()
查找指定子串首次出现位置 -> strstr()
分隔字符串 -> strtok()
注意: strtok()函数会破坏str的数据, 若需要保留数据, 请使用str的副本.
注意: strtok()函数只需要首次调用时传入str即可, 后续调用可传入NULL
void split(char * str, char * delim) { /* 首次调用strtok(): 初始化strtok()函数 且 获取第一个被切割的子串*/ char * token = strtok(str, delim); /* 后续调用strtok(): 获取 其他被切割处理的子串 */ while (token != NULL) { printf("str = %s\n", str); printf("delim = %s\n", delim); printf("token = %s\n\n", token); token = strtok(NULL, delim); } } int main() { char str1[80] = "First233Second233Third"; char str2[80] = "233"; split(str1, str2); } /* Output: str = First delim = 233 token = First str = First delim = 233 token = Second str = First delim = 233 token = Third */
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment