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. 总结

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

C语言用一级指针处理字符串的反思的更多相关文章

  1. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  2. C语言实现二级指针表示字符串数组

    头文件: #include<stdlib.h> #include<stdio.h> #include<string.h> 函数原型: char ** createB ...

  3. C语言学习笔记--指针与字符串

    字符类型 char(character)是一种整数,也是一种特殊的类型:字符.这是因为 ① 用单引号表示的字符字符字面量:‘a’,'1' ②‘’也是一个字符 ③printf和scanf里用%c来输入. ...

  4. C语言复习:字符串和一级指针

    字符串基本操作 字符数组初始化方法 int main() {     //1 {}号法 初始化列表     //数组初始化有2种方法 默认元素个数.指定元素个数     char buf1[] = { ...

  5. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  6. [C语言]进阶|指针与字符串

    ------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...

  7. 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)

    目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...

  8. 【C语言】-指针和字符串

    本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...

  9. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

随机推荐

  1. linux下安装apache与php

    http://www.92csz.com/study/linux/16.htm 1.apache 在如下页面下载apache的for Linux 的源码包 http://www.apache.org/ ...

  2. Python学习---DjangoForm的学习

    DjangoForm之创建工程 Form是什么东西: 用于验证用户请求数据合法性的一个组件 普通的Form提交的弊端: 1.用户提交数据的验证 2.前台需要进行错误信息的提示 3.需要保留上次用户输入 ...

  3. ESS控制台发布新功能:创建多实例规格的伸缩配置

    背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...

  4. 掷骰子游戏窗体实现--Java初级小项目

    掷骰子 **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰 ...

  5. npm ERR! path: '/usr/local/lib/node_modules/npm/node_modules/cacache/node_modules/ssri' }

    在安装appium 或者升级npm的过程中会遇到这个问题.出错时的代码提示如下: npm ERR! path /usr/local/lib/node_modules/npm/node_modules/ ...

  6. 四种Timer的区别和用法

    1.System.Threading.Timer 线程计时器 1.最底层.轻量级的计时器.基于线程池实现的,工作在辅助线程. 2.它并不是内在线程安全的,并且使用起来比其他计时器更麻烦.此计时器通常不 ...

  7. 转一篇shell中关于各种括号的讲解

    shell中各种括号的作用().(()).[].[[]].{} 一.小括号,圆括号()1.单小括号 ()   ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的 ...

  8. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  9. python反序列化

    import pickle import os class A(object): def __reduce__(self): a = """python -c 'impo ...

  10. 【BBS】BBS论坛项目各个页面的工作流程图

    1论坛整体结构 2数据库结构 3登录页面 4论坛首页(显示各个板块) 5显示板块对应的内容 6文章内容页 7新增板块.发表文章.回复 8版面管理.用户管理.发帖排行