C语言 删除字符串指针中的特定字符

删除字符串指针中的特定字符


今天写代码时遇到了这样的问题:需要删除字符串指针中的特定字符。
思考良久,写了一个demo,调试一番后勉强可以使用。
直接上代码。

void Delete_Character(char *pStr, char chr)
{
	char *p = pStr;
	while (*pStr != '\0')
	{
		if (*pStr != chr)
		{
			*p++ = *pStr;
		}
		pStr++;
 	}
	*p = '\0';
}

稍加解释一下:
这个方法是删除字符串中所有chr的字符。
需要注意的点:
① char *p = pStr,局部指针变量p指向pStr指向的内存,也就是说两个指针变量指向了同一块内存地址。
内存中映射如下(忽略大小端以及栈的增长顺序)
在这里插入图片描述
② 参数pStr也是局部变量,存储在栈上。
不管函数参数是普通变量还是指针变量,当函数退出后,这个变量都会回收,这是由于栈特性决定的。(地址传递和值传递在本质上是一样的)
③ 计算完的字符串后一定要记得加 ‘\0’

<think>好的,我现在需要帮助用户理解C语言中如何通过字符串指针访问其中的字符。用户可能已经有一定的C语言基础,但可能对指针字符串的具体操作还不熟悉。首先,我要确定用户的问题核心:字符串指针如何访问字符,可能包括如何遍历字符串或者访问特定位置的字符。 首先,我需要回忆C语言字符串的表示方法。C的字符串是以字符数组的形式存在,以空字符'\0'结尾。字符串指针实际上是指向这个字符数组首元素的指针。因此,用户的问题可能涉及到如何通过指针的算术运算或下标来访问各个字符。 接下来,我需要考虑用户可能的疑问点。比如,为什么可以通过指针加上索引来访问字符指针运算在这里是如何工作的。另外,用户可能想知道如何遍历整个字符串直到遇到空字符。还有可能涉及到指针和数组的区别,比如字符串字面量的不可修改性。 然后,我需要组织回答的结构。先解释字符串指针的基本概念,然后说明访问单个字符的方法,比如使用下标或指针算术。接着,可能需要演示遍历整个字符串的循环结构,强调空字符作为终止条件。同时,需要提醒用户注意指针的有效性和内存安全问题,比如避免越界访问或修改字符串字面量导致未定义行为。 可能还需要举例子,比如声明一个字符串指针char *str = "Hello";,然后展示如何访问第一个字符'H',或者通过循环打印每个字符直到遇到'\0'。同时,对比字符数组和指针的区别,比如char str[] = "Hello";可以修改内容,而指针指向的字面量可能存储在只读内存,修改会导致错误。 用户可能会有疑问,比如为什么使用指针而不是数组,或者如何动态分配字符串内存。因此,可能需要简要提及malloc和free的使用,但主要专注于访问字符的方法。同时,需要指出常见的错误,如忘记空字符导致无限循环,或者指针未初始化导致的段错误。 最后,确保语言简洁明了,用示例代码辅助解释,并强调关键点,如空字符的重要性、指针运算和下标访问的等价性,以及内存管理的注意事项。这样用户不仅知道如何操作,还能理解背后的原理和潜在的问题。</think>$\textbf{C语言字符串指针访问字符的步骤解析}$: $\textbf{核心原理}$: C语言字符串本质是字符数组,以空字符`'\0'`结尾。字符串指针指向该数组的首地址,可通过以下方式访问字符: $\textbf{访问方式}$: 1. $\textbf{下标法}$(直接索引) ```c char* str = "HELLO"; char first = str[0]; // 获取'H'(ASCII 72) char third = str[2]; // 获取'L'(ASCII 76) ``` 2. $\textbf{指针偏移法}$(地址运算) ```c char* p = str; // p指向首字符 char first = *p; // 解引用获取'H' char second = *(p+1); // 获取'E' ``` $\textbf{完整遍历示例}$: ```c char* s = "ABCD"; for(int i=0; s[i] != '\0'; i++){ // 直到遇到空字符 printf("字符%d: %c\n", i, s[i]); } /* 输出: 字符0: A 字符1: B 字符2: C 字符3: D */ ``` $\textbf{关键注意事项}$: | 操作场景 | 正确做法 | 错误示例 | 后果 | |--------------------------|-------------------------------------|-------------------------------|--------------------| | 访问越界字符 | 始终检查长度`strlen(s)` | `s[100]` | 未定义行为/段错误 | | 修改字符串字面量 | 改用字符数组`char arr[] = "text"` | `s[0] = 'X'` | 段错误(只读内存) | | 空指针访问 | 先验证指针有效性`if(s != NULL)` | `char* s=NULL; s[0]` | 段错误 | $\textbf{内存布局示意图}$: ``` 地址: 0x1000 0x1001 0x1002 0x1003 0x1004 数据: 'H' 'E' 'L' 'L' '\0' ↑ str指针 ``` $\textbf{高级技巧}$: 1. **指针递增遍历**(更接近底层实现) ```c while(*p != '\0'){ // *p等价于p[0] putchar(*p); p++; // 指针移动到下一字符地址 } ``` 2. **计算字符差值** ```c char* start = s; char* end = s + strlen(s); printf("字符串占 %ld 字节", end - start); // 地址差=字符数 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值