C算法编程题(六)串的处理
前言
上一篇《C算法编程题(五)“E”的变换》
连续写了几篇有关图形输出的编程题,今天说下有关字符串的处理。
程序描述
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
1. 把每个单词的首字母变为大写。
2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
3. 把单词中间有多个空格的调整为1个空格。
例如:
用户输入:
you and me what cpp2005program
则程序输出:
You And Me What Cpp_2005_program
用户输入:
this is a 99cat
则程序输出:
This Is A 99_cat
我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。
假设用户输入的串长度不超过200个字符。
程序实现
这个题目看起来很简单,但是想一想,用C的简单语法实现起来还是有些麻烦的,毕竟没有.net里面那么多字符串处理的方法。
题目就三个要求,就是字符转换和处理,感觉简单,但是却无从下手。
还是那句话,做这种编程题,思路清晰了,代码才好实现。这里我说一种思路,如果大家有更好的,欢迎交流。
如果转换、移除和插入一个字符,就必须知道上一个字符和下一个字符是什么,比如第二点要求,就得知道上一个字符是英文下一个字符是数字或是上一个字符是数字下一个字符是英文,第三点也是,去空格就得知道上一个和下一个字符都是空格,第一点也是如此,变大写就得索引是0或是上一个字符是空格和下一个字符是字符。
思路就是这样,理清了就会发现很简单了,然后就是一些细节处理了。
代码我就不分析了,直接贴下代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 void main() 5 { 6 char strArray[200] = {0}; 7 char strResult[400] = {0}; 8 int i=0,j=0,Len; 9 int nMark = 0; 10 11 printf("请输入字符串:\n"); 12 gets(strArray); 13 14 Len = strlen(strArray); 15 16 while(i<Len) 17 { 18 switch(nMark) 19 { 20 case 0: 21 { 22 if(strArray[i]>='a'&&strArray[i]<='z') 23 { 24 strResult[j++] = strArray[i++]-'a'+'A'; 25 nMark = 1; 26 } 27 else if(strArray[i]>='0'&&strArray[i]<='9') 28 { 29 strResult[j++] = strArray[i++]; 30 nMark = 2; 31 } 32 else if(strArray[i]==' ') 33 { 34 strResult[j++] = strArray[i++]; 35 nMark = 0; 36 } 37 } 38 break; 39 case 1: 40 { 41 if(strArray[i]>='a'&&strArray[i]<='z') 42 { 43 strResult[j++] = strArray[i++]; 44 nMark = 1; 45 } 46 else if(strArray[i]>='0'&&strArray[i]<='9') 47 { 48 strResult[j++] = '_'; 49 strResult[j++] = strArray[i++]; 50 nMark = 2; 51 } 52 else if(strArray[i]==' ') 53 { 54 strResult[j++] = strArray[i++]; 55 nMark = 3; 56 } 57 } 58 break; 59 case 2: 60 { 61 if(strArray[i]>='a'&&strArray[i]<='z') 62 { 63 strResult[j++] = '_'; 64 strResult[j++] = strArray[i++]; 65 nMark = 1; 66 } 67 else if(strArray[i]>='0'&&strArray[i]<='9') 68 { 69 strResult[j++] = strArray[i++]; 70 nMark = 2; 71 } 72 else if(strArray[i]==' ') 73 { 74 strResult[j++] = strArray[i++]; 75 nMark = 3; 76 } 77 } 78 break; 79 case 3: 80 { 81 if(strArray[i]>='a'&&strArray[i]<='z') 82 { 83 strResult[j++] = strArray[i++]-'a'+'A'; 84 nMark = 1; 85 } 86 else if(strArray[i]>='0'&&strArray[i]<='9') 87 { 88 strResult[j++] = strArray[i++]; 89 nMark = 2; 90 } 91 else if(strArray[i]==' ') 92 { 93 i++; 94 nMark = 3; 95 } 96 } 97 break; 98 default: 99 break; 100 } 101 } 102 103 puts("转换后的字符串为:"); 104 printf("%s",strResult); 105 106 getchar(); 107 }
运行结果:
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。