C语言之通过指针操作字符串

这篇具有很好参考价值的文章主要介绍了C语言之通过指针操作字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面我们来学习通过指针来灵活操作字符串的方法


判断字符串的长度

我们用对指针的遍历来实现判断字符串的长度

#include <stdio.h>
int str_length(const char*s)
{
	int len = 0;
	
	while(*s++)
		len++;
	
	return len;
}
int main()
{
	char str[128];
	
	printf("请输入字符:");
	scanf("%s", str);
	
	printf("输入的字符串\"%s\"长度为%d\n", str, str_length(str));
	
	return 0;
}

在函数形参的声明中由使用[ ]变为*,这些声明方式是一样的,只是表面上的一些变化,实质上并没有什么变化。

程序中发生实质性变化的事函数体,让我们结合下图来看(以输入的字符串five为例):

C语言之通过指针操作字符串,C语言,c语言,算法,开发语言,数据结构,学习

函数开始执行时,s指向所接收的字符串str第一个字符str[0],即“five”中的f,当*s为0(null字符)时,while循环结束,因此在没有遇到null字符时,指针s和变量len都会递增。

指针s在判断循环表达式中递增,变量len在循环体中递增

注意

指向数组元素的指针递增后指向下一个元素,递减后指向上一个元素。 

p++即p=p+1;p--=p-1

这里的str_length函数中并没有使用下标运算符,而是使用了指针运算符 *和递增运算符++,这种技巧很常用,大家一定要好好理解。


字符串的复制

#include<stdio.h>

char* str_copy(char *d, const char *s)
{
	char *t = d;
	while(*d++ = *s++)
		;
	return t;
}
int main()
{
	char str[128] = "ABC";
	char tmp[128];
	
	printf("str = \"%s\"\n", str);
	
	printf("复制的是:");
	scanf("%s", tmp);
	
	str_copy(str, tmp);
	
	puts("复制了。");
	printf("str = \"%s\"\n", str);

	return 0;
}

我们首先来看str_copy函数中内实现字符串复制功能的while语句,控制表达式*d++ = *s++是比较复杂的。后置递增运算符++在对左操作数进行判定后会进行递增,因此控制表达式的判定和执行分为两个阶段(以str=ABC, tmp=abc为例):

①通过*d = *s进行赋值

指针s指向的字符会赋值给指针d指向的字符

②指针d和指针s递增

赋值结束后,指针d和s分别指向下一个字符。

③结果判断

对指向的指针所指向的字符进行判断,若指向的是null字符,while语句循环结束,否则就重复①和②两步直至指向null字符。

我们用图来表示:(剩下的步骤是重复的)

C语言之通过指针操作字符串,C语言,c语言,算法,开发语言,数据结构,学习

复制时不同语句的写法

 我们还可以对指针d和s使用下标运算符,如下:

while(d[i] = s[i])
	;
i++;

与上面代码相比,该上面使用指针运算符的程序具有以下优点:

不需要用于下标的变量i,可以节约少量内存

运行效率有望更高


不正确的字符串赋值

下面的程序与上面的程序大致相同,str_copy函数一样,main函数有所不同:

#include<stdio.h>

char* str_copy(char *d, const char *s)
{
	char *t = d;
	while(*d++ = *s++)
		;
	return t;
}
int main()
{
	char* str = "ABC";
	char tmp[128];
	
	printf("str = \"%s\"\n", str);
	
	printf("复制的是:");
	scanf("%s", tmp);
	
	str_copy(str, tmp);
	
	puts("复制了。");
	printf("str = \"%s\"\n", str);

	return 0;
}


这个程序犯了两个错误

改写了字符串字面量

这个程序改写了指针str指向的字符串字面量的内容,但是,是否可以更改是取决于编译器,在不支持改写字符串字面量的编译器中,该程序不能正常运行。

可能会写入非空的内存空间

指针str指向了字符串字面量的“ABC”中的第一个字符,该字符串包括null字符在内长度为4位,在进行复制时,不能保证复制所需要的内存空间是空着的,在该内存空间甚至是保存着系统的关键信息

所以,进行复制时有可能会破坏其他变量的值,甚至会导致程序运行异常。

注意

不要改写字符串字面量,也不用对超过字符串字面量的内存单元进行写入操作。


返回指针的函数

str_copy函数的返回值类型是指向char型变量的指针型,只要是用到这种数据类型的地方都能调用该函数。

函数的返回值是t,它复制于传入的形参t,这就意味着函数返回的是“指向复制后的字符串中的第一个字符的指针”。


关于指针的基础知识学习我们就已经学习完了,在学完基础篇后我们会进行更加深入的学习,来打好更加深厚的基础。

 文章来源地址https://www.toymoban.com/news/detail-806264.html

到了这里,关于C语言之通过指针操作字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】算法(模拟、指针等)解决字符串类题目(C++)

    字符串题目有很多种,这里筛选几个考察模拟、双指针等的题目,并用相关算法解决。 思路 题意分析 :题目要求找到字符串数组中的最长公共前缀。 解法一 : 两两比较 遍历数组,每次比较后更新最长公共前缀,并循环比较找最长公共前缀 解法二 : 统一比较 遍历第一个

    2024年01月16日
    浏览(38)
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

    分析:    在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。   在主函数 main 中,定义一个大小为 20 的字符数组 a,用于存储输入的字符串。然

    2024年01月21日
    浏览(48)
  • 计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

    1,题目描述 2,分析题目 Ⅰ,题目中要求 除了函数的形参,函数中不能够使用多余的变量 (这是比较 苛刻 的要求)。 Ⅱ,根据此,很自然的想到需要使用 递归 来解决问题。 Ⅲ, 字符串的结束标志是\\\'\\0\\\',因此可以将 读取到\\\'\\0\\\' 作为结束条件 3,关于递归的基本知识 Ⅰ,递

    2024年02月03日
    浏览(39)
  • C语言----字符串操作函数汇总

            在C的库函数中,有丰富的字符串操作函数,在平时的coding中灵活运用这些库函数会达到事半功倍的效果 char *strcpy(s, ct) 将字符串ct(包括\\\'\\0\\\')复制到字符串s中,并返回s,需要注意s的长度是否容纳ct。 char *strncpy(s, ct, n) 将字符串ct中最多n个字符复制到字符串s中,并

    2024年02月14日
    浏览(38)
  • 算法竞赛字符串常用操作大全

    Bufferedreader bf=new BufferedReader(new InputStreamReader(System.in)); String s[]=bf.readLine().split(\\\" \\\") split(\\\" \\\") 表示 去掉 输入的串中的 空格 split(\\\"\\\") 表示 去掉 输入的串中的 根据题目要求, 想去什么符号就在 split(\\\"\\\") 引号中加什么。 常用输入转换: 以此题为例 👇 : 先读入n行字符串数组 再

    2024年02月16日
    浏览(36)
  • 【C语言进阶(三)】字符串操作函数

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月09日
    浏览(37)
  • C语言实现删除字符串中重复字符的算法

    C语言实现删除字符串中重复字符的算法 问题描述: 给定一个字符串,我们需要编写一个C语言函数,以删除字符串中的重复字符。例如,对于输入字符串\\\"hello world\\\",函数应该返回\\\"hel wrd\\\"。 算法思路: 为了解决这个问题,我们可以使用一个哈希表来跟踪每个字符的出现次数。

    2024年02月04日
    浏览(32)
  • c语言——字符串函数和内存操作函数

    包含在string.h头文件里 功能:返回字符串中有效字符的个数,遇到‘\\0’结束,不包括结束符‘\\0’. 函数的参数为------const char* str:字符指针 返回值的类型------size_t:无符号整数(即:unsigned int) 模拟实现strlen: 方法一:计数器的方法 方法二:不能创建临时变量的计数器

    2024年02月14日
    浏览(59)
  • C语言之字符串,内存操作函数详解(一)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月08日
    浏览(39)
  • 深入了解字符串处理算法与文本操作技巧

    引言 字符串处理是计算机科学和数据处理的核心领域之一。本博客将深入介绍一些常见的字符串处理算法和文本操作技巧,包括字符串匹配、搜索、正则表达式、字符串操作和文本标准化等。 暴力匹配算法 什么是暴力匹配? 暴力匹配算法是一种最简单的字符串匹配方法,它

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包