IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++PrimerPlus 第七章 函数-C++的编程模块-7.5 函数和C-风格字符串 -> 正文阅读

[C++知识库]C++PrimerPlus 第七章 函数-C++的编程模块-7.5 函数和C-风格字符串

目录

7.5?函数和C-风格字符串

7.5.1?将C-风格字符串作为参数的函数

7.5.2?返回C-风格字符串的函数


7.5?函数和C-风格字符串

C-风格字符串由一系列字符组成,以空值字符结尾。前面介绍的大部分有关设计数组函数的知识也适用于字符串函数。

例如,将字符串作为参数时意味着传递的是地址,但可以使用const来禁止对字符串参数进行修改。然而,下面首先介绍一些有关字符串的特殊知识。

7.5.1?将C-风格字符串作为参数的函数

假设要将字符串作为参数传递给函数,则表示字符串的方式有三种:

  • char数组;
  • 用引号括起的字符串常量(也称字符串字面值);
  • 被设置为字符串的地址的char指针。

但上述3种选择的类型都是char指针(准确地说是char*),因此可以将其作为字符串处理函数的参数:

????????char ghost[15] = "galloping";

????????char* str = "galumphing";

????????int n1 = strlen(ghost); //ghost is &ghost[0]

????????int n2 = strlen(str); //pointer to char

????????int n3 = strlen("galumphing"); //address of string

可以说是将字符串作为参数来传递,但实际传递的是字符串第一个字符的地址。这意味着字符串函数原型应将其表示字符串的形参声明为char*类型。

C-风格字符串与常规char数组之间的一个重要区别是,字符串有内置的结束字符(前面讲过,包含字符,但不以空值字符结尾的char数组只是数组,而不是字符串)。这意味着不必将字符串长度作为参数传递给函数,而函数可以使用循环依次检查字符串中的每个字符,直到遇到结尾的空值字符为止。程序清单7.9演示了这种方法,使用一个函数来计算特定的字符在字符串中出现的次数。由于该程序不需要处理负数,因此它将计数变量的声明为unsigned int。

程序清单7.9 strgfun.cpp

//strgfun.cpp -- functions with a string argument
#include<iostream>
unsigned int c_in_str(const char* str, char ch);
int main()
{
	using namespace std;
	char mmm[15] = "minimum";		//string in an array
//some systems require preceding char with static to
//enable array initialization

	char* wail = "ululate";			//wail points to string
	
	unsigned int ms = c_in_str(mmm, 'm');
	unsigned int us = c_in_str(wail, 'u');
	cout << ms << " m characters in " << mmm << endl;
	cout << us << " u characters in " << wail << endl;
	return 0;
}

//this function counts the number of ch characters
//in the string str
unsigned int c_in_str(const char* str, char ch) {
	unsigned int count = 0;
	
	while(*str)		//quit when *str is '\0'
	{
		if (*str == ch)
			count++;
		str++;		//move pointer to next char
	}
	return count;
}

下面是该程序的输出:

????????3 m characters in minimum

????????2 u characters in ululate

程序说明

由于程序清单7.9中的c_in_str()函数不应修改原始字符串,因此它在声明形参str时使用了限定符const。这样,如果错误地址函数修改了字符串的内容,编译器将捕捉这种错误。当然,可以在函数头中使用数组表示法,而不声明str:

????????unsigned int c_in_str(const char str[], char ch);

然而,使用指针表示法提醒读者注意,参数不一定必须是数组名,也可以是其他形式的指针。

该函数本身演示了处理字符串中字符的标准方式:

????????while(*str)

????????{

????????????????statements

????????????????str++;

????????}

str最初指向字符串的第一个字符,因此*str表示的是第一个字符。例如,第一次调用该函数后,*str的值将为m——“minimum”的第一个字符。只要字符不为空值字符(\0),*str就为非零值,因此循环将继续。在每轮循环的结尾处,表达式str++将指针增加一个字节,使之指向字符串中的下一个字符。最终,str将指向结尾的空值字符,使得*str等于0——空值字符的数字编码,从而结束循环。

7.5.2?返回C-风格字符串的函数

现在,假设要编写一个返回字符串的函数。是的,函数无法返回一个字符串,但可以返回字符串的地址,这样做的效率更高。例如,程序清单7.10定义了一个名为buildstr()的函数,该函数返回一个指针。该函数接受两个参数:一个字符和一个数字。函数使用new创建一个长度与数字参数相等的字符串,然后将每个元素都初始化为该字符。然后,返回指向新字符串的指针。

程序清单7.10 strgback.cpp

//strgback.cpp -- a function that returns a pointer to char
#include<iostream>
char* buildstr(char c, int n);		//prototype
int main()
{
	using namespace std;
	int times; 
	char ch;

	cout << "Enter a character: ";
	cin >> ch;
	cout << "Enter an integer: ";
	cin >> times;
	char* ps = buildstr(ch, times);
	cout << ps << endl;
	delete[]ps;						//free memory
	ps = buildstr('+', 20);			//reuse pointer
	cout << ps << "-DONE-" << ps << endl;
	delete[] ps;					//free memory
	return 0;
}

//builds string made of n c characters
char* buildstr(char c, int n) 
{
	char* pstr = new char[n + 1];
	pstr[n] = '\0';		//terminate string
	while (n-- > 0)
		pstr[n] = c;	//fill rest of string
	return pstr;
}

下面是该程序的运行情况:

????????Enter a character: V

????????Enter an integer: 46

????????VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

????????++++++++++++++++++++-DONE-++++++++++++++++++++

程序说明

要创建包含n个字符的字符串,需要能够存储n+1个字符的空间,以便能够存储空值字符。因此,程序清单7.10中的函数请求分配n+1个字节的内存来存储该字符串,并将最后一个字节设置为空值字符,然后从后向前对数组进行填充。在程序清单7.10中,下面的循环将执行n次,直到n减少到0,这将填充n个元素:

????????while (n-- > 0)

????????????????pstr[n] = c;

在最后一轮循环开始时,n的值为1。由于n——意味着先使用这个值,然后将其递减,因此while循环测试条件将对1和0进行比较,发现测试为true,循环继续。测试后,函数将n减为0,因此pstr[0]是最后一个被设置为c的元素。之所以从后向前(而不是从前向后)填充字符串,是为了避免使用额外的变量。从前向后填充的代码将与下面类似:

????????int i = 0;

????????while (i < n)

????????????????pstr[i++] = c;

注意,变量pstr的作用域为buildstr函数内,因此该函数结束时,pstr(而不是字符串)使用的内存将被释放。但由于函数返回了pstr的值,因此程序仍可以通过main()中的指针ps来访问新建的字符串。

当该字符串不再需要时,程序清单7.10中的程序使用delete释放该字符串占用的内存。然后,将ps指向为下一个字符串分配的内存块,然后释放它们。这种设计(让函数返回一个指针,该指针指向new分配的内存)的缺点是,程序员必须记住使用delete。在第12章中,读者将知道C++类如何使用构造函数和析构函数负责为您处理这些细节。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:33:07  更:2022-09-30 00:37:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 4:01:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码