1.一级指针处理字符串的常见方式

如果使用单个指针,不方便对字符串本身进行操作,只适合遍历。

使用两个指针,

两个指针和字符串大致有两个常见处理方式:

(1)两个指针从字符串首部开始向后移动,同时处理字符串。

(2)两个指针分别指向字符串首部和尾部,向中间靠拢。

2.两个指针放在字符串两端

示例:

去除字符串两端的空格。

#include <ctype.h>
#include <string.h>
#include <stdio.h> void trimSpace(const char *str, char *newStr, int len)
{
const char *p, *q;
int len2; if (NULL == str || NULL == newStr)
return; p = str;
q = p + strlen(str) - ;
while (p < q && isspace(*p)) ++p;
while (p < q && isspace(*q)) --q;
len2 = q - p +;
if (len >= len2) {
memcpy(newStr, p, len2);
newStr[len2] = ;
} else {
memcpy(newStr, p, len);
newStr[len] = ;
} } int main()
{
char str[] = " abcabc ";
char str2[] = {}; trimSpace(str, str2, sizeof(str2) - );
printf("%s\n", str2); return ;
}

(2)字符串翻转

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/* 非递归版本,使用指针放在字符串两端 */
void inverse(char *str)
{
char *p, *q, tmp; if (NULL == str)
return; p = str;
q = str + strlen(str) - ;
while (p < q) {
tmp = *p;
*p = *q;
*q = tmp;
++p, --q;
}
} static void _inverse1(char *str1, char *str2)
{
if (!*str2)
return;
_inverse1(str1, str2+);
strncat(str1, str2, );
}
/* 递归版本 */
void inverse1(char *str)
{
char *tmp = NULL;
if (NULL == str)
return;
if ((tmp = (char *)calloc(strlen(str) + , sizeof(char))) == NULL)
return;
_inverse1(tmp, str);
strncpy(str, tmp, strlen(tmp)+);
free(tmp);
} int main()
{
char str[] = ""; inverse1(str);
printf("%s\n", str); return ;
}

3.两个指针放在字符串首部

(1)strstr挖字符串

#include <string.h>
#include <stdio.h> int getCount(const char *str1, const char *str2)
{
const char *p1 = str1, *p2 = str2;
int count = ; if (NULL == str1 || NULL == str2)
return -; while (str1 = strstr(str1, str2)) {
count++;
str1 += strlen(str2);
} return count;
} int main()
{
char str[] = "gsadgdasabcadfaabcasdabc";
char str2[] = "abc";
int n; n = getCount(str, str2);
printf("%d\n", n); return ;
}

(2)去除字符串中的某些字符

去除空格。

old指针的意义是:指向旧的数组,并挖出非空格的字符输出给新数组。

new指针的意义是:指向新的数组,并输入old指针传来的字符。

由于 new 永远不会超过 old 所以,新、旧数组可以使用同样的空间。

#include <ctype.h>
#include <string.h>
#include <stdio.h> void trimSpace(char *str)
{
char *new, *old; if (NULL == str)
return; new = str;
old = str;
while (*old) {
if (isspace(*old))
++old;
else
*new++ = *old++;
}
*new = ;
} int main()
{
char str[] = " 12 34 56 78 "; trimSpace(str);
printf("%s\n", str); return ;
}

4. 总结

如果使用一级指针处理字符串,应该先思考两个一级指针应该放在字符串两端还是一端,然后思考每个指针的实际意义。

最新文章

  1. 四种主要网络IO虚拟化模型
  2. PHP面向对象_重载新的方法(parent::)
  3. 【对noip结束后一个月内的总结】
  4. 用淘宝ip地址库查ip
  5. ucgui
  6. voucer
  7. POJ_3111_K_Best_(二分,最大化平均值)
  8. 苹果App store 2015最新审核标准公布(2015.3)
  9. 使用QtCreator作为ROS调试器
  10. 关于C(m,n)%p的故事
  11. Could not execute JDBC batch update; SQL [delete from role where roleId=?]; constraint [null]; neste
  12. popOver 弹出框简单使用
  13. 深度解析continue,break和return
  14. FileSystemWatcher类监控文件的更改状态并且实时备份文件
  15. P2068 统计和(树状数组模板)
  16. Windows安装启动MySQL
  17. Ubantu 使用extundelete恢复数据
  18. word自动生成章节标题
  19. 【EF】EntityFramework 更新数据库字段的三种方法
  20. Ionic3,安装,创建项目(一)

热门文章

  1. Python学习---django下的cookie操作 180201
  2. Mysql常用语句与函数(待续)
  3. 沉淀再出发:用python画各种图表
  4. Angular Reactive Forms -- Model-Driven Forms响应式表单
  5. windows系统查看端口占用程序方法
  6. 【jQuery】deferred对象了解
  7. Python自动化之Django中间件
  8. LeetCode39.组合总和 JavaScript
  9. 分布式消息通信ActiveMQ
  10. ES6读书笔记(二)