当前位置:嗨网首页>书籍在线阅读

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

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

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++类如何使用构造函数和析构函数负责为您处理这些细节。