04_字符串与指针进阶
C语言练习大全四字符串与指针进阶 字符串处理和指针操作是 C 语言的核心难点。本篇通过实际练习让你真正理解指针和字符串的配合使用。目录字符分类统计字母频率统计删除指定字符提取数字和字母字符串查找字符串逆序指针版字符串循环左移字符串插入排序单词首字母大写字符串转整数atoi实现求 e 的近似值级数求和PI的近似1. 字符分类统计知识点指针遍历 字符判断统计字符串中字母、数字、空格、其他字符的个数。#includestdio.hvoidpin(char*a,int*le,int*dig,int*ta,int*out){for(;*a!\0;a){if((A*a*aZ)||(a*a*az))(*le);elseif(0*a*a9)(*dig);elseif(*a )(*ta);else(*out);}}intmain(){chara[200]aowduh wankdnia ska1i1e38/]CIOQONVBm1354^%$;intle0,dig0,ta0,out0;pin(a,le,dig,ta,out);printf(字母:%d, 数字:%d, 空格:%d, 其他:%d,le,dig,ta,out);return0;}新手要点指针遍历字符串for (; *a ! \0; a)— 逐个字符访问直到遇到结束符传指针给函数可以在函数内部修改外部变量的值传地址2. 字母频率统计知识点数组作为哈希表统计字符串中每个小写字母出现的次数。#includestdio.hvoidfun(char*tt,intpp[]){inti;for(i0;tt[i];i){if(tt[i]att[i]z){pp[tt[i]-a];// 核心技巧字符转下标}}}intmain(){chartt[100]awdhuwabcbjakjakwudhksbac hdgfqtywcdttyskzkkjeiq;intpp[26]{0};fun(tt,pp);charaa;inti;for(i0;i26;i){printf(%c: %d\n,ai,pp[i]);}return0;}新手要点pp[tt[i] - a]是经典技巧a-a0b-a1用字符值做数组下标这就是桶计数思想时间复杂度 O(n)3. 删除指定字符知识点双指针法从字符串中删除所有a字符。#includestdio.hintmain(){chara[100]waodhuabciaaaadwa;puts(a);char*p,*q;pa;qa;for(;*p!\0;p){if(*p!a){*q*p;q;}}*q\0;puts(a);return0;}新手要点双指针法p是读指针q是写指针p遍历所有字符遇到不是a的就写到q的位置最后别忘了加\0结束符4. 提取数字和字母知识点字符判断 双指针从混合字符串中提取数字和字母去掉其他字符。#includestdio.h#includestring.hvoidfunc(intlen,chars[]){inti,j;// 先提取前面的数字for(i0,j0;ilen;){if(1s[i]s[i]9){s[j]s[i];}else{break;}}// 再提取后面的字母while(s[i]!\0){if((As[i]s[i]Z)||(as[i]s[i]z)){s[j]s[i];}else{i;}}s[j]\0;}intmain(){chars[]1234ASDXFR12321aihdbbiioa12344dnn;intlenstrlen(s);func(len,s);puts(s);return0;}5. 字符串查找知识点字符串匹配在主字符串中查找子字符串第一次出现的位置。#includestdio.h#includestring.hintmain(){charch[]mdsdufhawbduiwmark,auhwuidac bimarkwian;charc[100],s[100];intlen,i,j,sign-1;scanf(%s,s);lenstrlen(s);for(i0;ch[i]!\0;i){if(s[0]ch[i]){for(j0;jlench[ij]!\0;j){c[j]ch[ij];}c[j]\0;if(strcmp(c,s)0){sign-sign;break;}}}if(sign0){printf(找到字符串: );puts(c);printf(第一次出现的位置: %d,i);}else{printf(你要找的字符串不存在);}return0;}新手要点这是最朴素的字符串匹配算法暴力法先找到首字符匹配的位置再逐个比较后续字符更高效的算法可以学习 KMP 算法6. 字符串逆序知识点指针 首尾交换用指针实现字符串逆序。#includestdio.h#includestring.hintmain(){charstr[]qwerty;char*p,*q,temp;for(pstr1,qstrstrlen(str)-2;pq;p,q--){printf(%c, %c\n,*p,*q);temp*p;*p*q;*qtemp;}printf(%s\n,str);return0;}新手要点str 1跳过第一个字符str strlen(str) - 2跳过最后一个两个指针从两端向中间靠拢逐对交换7. 字符串循环左移知识点字符数组操作把字符串前 m 个字符移到末尾。#includestdio.h#includestring.hvoidfun(chars[],intm){intlenstrlen(s);inti,j;charn;for(i0;im;i){ns[0];// 保存第一个字符for(j1;jlen;j){s[j-1]s[j];// 所有字符前移一位}s[j-1]n;// 把第一个放到最后}}intmain(){chars[9]abcdefgh;intm;scanf(%d,m);fun(s,m);puts(s);return0;}8. 字符串插入排序知识点字符串排序对字符串中的字符进行插入排序降序。#includestdio.h#includestring.hvoidfun(charch[]){intlenstrlen(ch);inti,j;charkey;for(i1;ilen;i){keych[i];ji-1;while(j0ch[j]key){ch[j1]ch[j];j--;}ch[j1]key;}}intmain(){charch[100];gets(ch);fun(ch);puts(ch);return0;}9. 单词首字母大写知识点状态机思想把句子中每个单词的首字母转为大写其余转为小写。#includestdio.hintmain(){chark ;inti,j;chars[80]i haVe attAChEd to thIs teTTer person InFORMAtion;for(i1;s[i];i){if(k s[i-1]! ){// 前一个是空格当前不是 → 单词开头if(as[i-1]s[i-1]z)s[i-1]s[i-1]-32;// 转大写// 单词其余部分转小写for(ji;s[j]! s[j]!\0;j){if(As[j]s[j]Z)s[j]32;// 转小写}}ks[i-1];}puts(s);return0;}新手要点大写转小写 32ASCII 中 A65, a97差 32小写转大写- 32通过前一个字符是否为空格来判断单词边界10. 字符串转整数知识点手写atoi函数把字符串 “123” 转换为整数 123。#includestdio.hintpun(char*a){char*i;intsum0,j;for(ia;*i!\0;i){j(*i-0);// 字符转数字sumsum*10j;// 核心公式}returnsum;}intmain(){chara[100]123;intsum1pun(a);printf(%d\n,sum1);return0;}新手要点*i - 0把字符1转为数字1sum sum * 10 j是逐位累加的核心公式例如 “123”0*1011→1*10212→12*10312311. 求 e 的近似值知识点级数求和e 1 1/1! 1/2! 1/3! … 直到某项小于 1e-6#includestdio.hintmain(){doublee1;doubleitem1;inti;for(i1;1.0/item1e-6;i){item*i;// 累乘求阶乘e1.0/item;// 累加倒数}printf(%f\n,e);return0;}新手要点自然常数 e ≈ 2.718282每次循环算一个阶乘的倒数累加到结果中当新项足够小时停止——这就是精度控制12. 级数求和PI 的近似知识点交替级数PI/4 1 - 1/3 1/5 - 1/7 …莱布尼茨公式#includestdio.h#includemath.hintmain(){inti;doublesum0,item;intsign1;for(i1;fabs(item1.0/(2*i-1))1e-6;i){sumitem*sign;sign-sign;// 正负交替}printf(PI ≈ %lf\n,4*sum);return0;}新手要点sign -sign实现正负交替1, -1, 1, -1…这个级数收敛很慢需要很多项才能得到精确值本篇总结知识点涉及题目指针遍历字符串字符分类统计、字母频率双指针法删除字符、提取数字字母字符串操作查找、逆序、循环左移、排序字符转换首字母大写、字符串转整数级数求和e 的近似、PI 的近似学习建议指针是 C 语言的灵魂也是最大的难点。多画内存图多调试不要怕——每个 C 语言程序员都是从指针恐惧症中走出来的。下篇预告《C语言练习大全五结构体与综合应用》— 结构体排序、文件操作、递归函数…