课题《字符串提取的函数代码!不准用字符处理函数实现! 》
要求:
给定一个字符串如:“ewewewe,.,,rerere-;;ewewewe'rerrere”
如何将字符串提取出来,打印如下:
ewewewe
rerere
ewewewe
rerrere
调用函数 tiqu(char const *p,char *s)
不准用字符处理函数实现! /*现在想想字符处理函数不准用,字符串处理函数行不,要知道在C++里面字符和字符串可以两个概念哎——嘻嘻*/
备注:
《字符串提取的函数代码!不准用字符处理函数实现! 》 这是我在论坛上看见的一篇请求,当时,感觉不难,直到自己动手写的时候才发现,不难的东西往往有很大的优化空间,应此,先后写了三段不同的代码,论坛上已经贴了前两段(现在发现论坛上原先的前两段编写时忽略了一种情况,即首字符就是标点)……
内容:
代码1:
#include <stdio.h>
void tiqu(char const* p, char* s)
{
const char* tmp = s;
while(*p) {
if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) {
*s++ = *p++;
}
else {
if (tmp == s) {//判断是不是首字符
continue;
}
*s++ = '\n';
while ((*p <= 'a' || *p >= 'z') && (*p <= 'A' || *p >= 'Z'))
++p;
}
}
*s = '\0';
}
int main()
{
char str[255];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
tiqu(istr, str);
printf("%s\n", str);
return 0;
}
代码2:
#include <stdio.h>
//#define ISPT(C) (C <= 'a' || C >= 'z') && (C <= 'A' || C >= 'Z')//可以使用宏简化代码
void tiqu(char const* p, char* s)
{
const char* tmp = s;
while(*s = *p) {
++p;
if ((*s <= 'a' || *s >= 'z') && (*s <= 'A' || *s >= 'Z')) {
//使用宏简化代码时用 if (ISPT(*s)) {
if (tmp == s) {//判断是不是首字符
continue;
}
*s = '\n';
while ((*p <= 'a' || *p >= 'z') && (*p <= 'A' || *p >= 'Z')) {
//使用宏简化代码时用 while (ISPT(*p))
++p;
}
}
++s;
}
}
int main()
{
char str[255];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
tiqu(istr, str);
printf("%s\n", str);
return 0;
}
代码3:
#include <stdio.h>
void tiqu(char const* p, char* s)
{
const char* tmp = s;
while(*s = *p) {
++p;
if ((*s <= 'a' || *s >= 'z') && (*s <= 'A' || *s >= 'Z')) {
if (tmp != s && *(s - 1) != '\n') {
*s++ = '\n';
}
continue;
}
++s;
}
}
int main()
{
char str[255];
char* istr = "ewewewe,.,,rerere-;;ewewewe'rerrere";
tiqu(istr, str);
printf("%s\n", str);
return 0;
}
这三段代码,主要区别在while循环中
后记:
虽然没有真正测试过,不过后者应该会比前者效率高点。但同时感觉还有进一步提高的可能……