`

<转>string中c_str()、data()、copy(p,n)函数的用法

    博客分类:
  • C++
C++ 
阅读更多

原文来自:http://www.cnblogs.com/qlwy/archive/2012/03/25/2416937.html

 

标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组:c_str()、data()、copy(p,n)。

1. c_str():生成一个const char*指针,指向以空字符终止的数组。

注:

①这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中。注意 看下例:

const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:abcd
 

上面如果继续用c指针的话,导致的错误将是不可想象的。就如:1234变为abcd

其实上面的c = s.c_str(); 不是一个好习惯。既然c指针指向的内容容易失效,我们就应该按照上面的方法,那怎么把数据复制出来呢?这就要用到strcpy等函数(推荐)。

//const char* c; //①
//char* c;       //②
//char c[20];
char* c=new char[20];
string s="1234";
//c = s.c_str();
strcpy(c,s.c_str());
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:1234
 

注意:不能再像上面一样①所示了,const还怎么向里面写入值啊;也不能②所示,使用了未初始化的局部变量“c”,运行会出错的 。

② c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。

2. data():与c_str()类似,但是返回的数组不以空字符终止。

3. copy(p,n,size_type _Off = 0):从string类型对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始,但是也可以指定,开始的位置(记住从0开始)。返回真正从对象中复制的字符。------用户要确保p指向的空间足够保存n个字符

// basic_string_copy.cpp
// compile with: /EHsc /W3
#include <string>
#include <iostream>
 
int main( )
{
    using namespace std;
    string str1 ( "1234567890" );
    basic_string <char>::iterator str_Iter;
    char array1 [ 20 ] = { 0 };
    char array2 [ 10 ] = { 0 };
    basic_string <char>:: pointer array1Ptr = array1;
    basic_string <char>:: value_type *array2Ptr = array2;
 
    cout << "The original string str1 is: ";
    for ( str_Iter = str1.begin( ); str_Iter != str1.end( ); str_Iter++ )
        cout << *str_Iter;
    cout << endl;
 
    basic_string <char>:: size_type nArray1;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray1 = str1.copy ( array1Ptr , 12 );  // C4996
    cout << "The number of copied characters in array1 is: "
        << nArray1 << endl;
    cout << "The copied characters array1 is: " << array1Ptr << endl;
 
    basic_string <char>:: size_type nArray2;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray2 = str1.copy ( array2Ptr , 5 , 6  );  // C4996
    cout << "The number of copied characters in array2 is: "
        << nArray2 << endl;
    cout << "The copied characters array2 is: " << array2Ptr << endl;
     
    ////注意一定要使array3有足够的空间
    //char array3[5]={0};
    //basic_string<char>::pointer array3Ptr=array3;
    //basic_string<char>::size_type nArray3;
    //nArray3 = str1.copy(array3,9); //错误!!!!
    //cout<<"The number of copied characters in array3 is: "
    //  <<nArray3<<endl;
    //cout<<"The copied characters array3 is: "<<array3Ptr<<endl;
}

 上面最后注释掉的部分,虽然编译没有错误,但是运行时会产生错误:Stack around the variable 'array3' was corrupted.

分享到:
评论

相关推荐

    string中c_str(),data(),copy(p,n)函数的用法总结

    在C++标准库中,`std::string` 类型提供了几个方法来访问其内部存储的字符序列,其中包括 `c_str()`, `data()` 和 `copy(p, n)`。这三个函数在处理字符串时非常常用,但它们各有不同的特性和用途。 1. `c_str()` ...

    C++中string的用法

    C++中string的用法 C++中的string类是C++标准程序库中的一部分,相比于C语言中的char*字符串,它具有更多的优点,例如不需要担心内存是否足够、字符串长度等问题。同时,作为一个类,它集成了许多操作函数,可以...

    【c中string的用法】c语言string类用法.docx

    资源摘要信息"C语言string类用法" c语言中的字符串是一种非常重要的数据类型,它广泛应用于各种程序中。...c语言中的字符串是一个非常重要的数据类型,它提供了多种操作函数和方法来帮助我们更好地管理和使用字符串。

    string类型的全部函数

    `c_str`函数将`string`转换为C风格的字符串,即`const char*`。这在需要与不支持`std::string`的旧式API交互时很有用。例如: ```cpp std::string str = "C Style"; const char* cStr = str.c_str(); ``` #### 6. `...

    C++中的string类

    本文将详细介绍如何在C++程序中使用`string`类,包括其声明、初始化、常用成员函数以及一些高级用法。 #### 包含必要的头文件 要在C++程序中使用`string`类,必须首先包含 `&lt;string&gt;` 头文件。请注意,不要将其与...

    stl string常用函数

    * `int copy(char *s, int n, int pos = 0) const`: 把当前字符串中以 `pos` 开始的 `n` 个字符拷贝到以 `s` 为起始位置的字符数组中,返回实际拷贝的数目。 特性描述 STL String 类提供了多种特性描述,包括: *...

    在C语言函数中调用汇编语言程序实现字符串的拷贝

    在C语言中,我们通常使用标准库函数如`strcpy`来拷贝字符串。然而,在某些特定情况下,如优化性能或理解底层操作,我们可能需要直接调用汇编语言程序来实现这一功能。在这个主题中,我们将探讨如何在C语言函数中嵌入...

    C++ String 类常用成员函数汇总

    copy 函数可以用来把当前字符串中的一部分拷贝到一个 C 字符数组中。 再次,String 类的特性描述函数可以用来获取字符串的某些特性。例如,capacity() 函数可以返回当前字符串的容量(即字符串中不必增加内存即可...

    C++string类常用函数

    - **使用指定数量的相同字符初始化**:`string(int n, char c);` - 创建一个包含 `n` 个字符 `c` 的 `string` 对象。例如: ```cpp string s2(5, 'a'); // s2 的值为 "aaaaa" ``` - **默认构造函数**:`string()...

    C++中CString string char* char 之间的字符转换(多种方法)

    这里,我们使用copy函数将string对象s1转换成char*类型的字符串data。 CString、string、char*之间的字符转换是C++编程中非常重要的一部分。只有正确地进行字符转换,才能确保程序的正确运行。

    C++ string类常用函数

    C++ string 类常用函数 C++ 中的 string 类是一个非常常用的类,它提供了很多有用的函数来操作字符串。下面对 string 类的常用函数进行详细的介绍。 构造函数 C++ 中的 string 类有多种构造函数,可以用不同的...

    string的常用函数

    本文将深入探讨 `std::string` 类的各种构造方法以及一系列重要的字符串操作函数,并对它们的功能进行详细说明。 #### 二、构造函数与析构函数 `std::string` 类提供了多种构造方法来创建字符串对象: 1. **默认...

    标准c++中string类函数介绍

    ### 标准C++中String类函数介绍 在C++编程语言中,`std::string` 类是处理字符串的一种非常高效且便捷的方式。相比于传统的 `char *` 字符串,`std::string` 提供了更多的功能,并且更加安全可靠。下面我们将详细...

    string 用法大全.pdf

    - 复制到C字符串:`copy()`, `c_str()`, `data()` 将`std::string`转换为C风格的字符串。 - 子字符串:`substr()` 获取子字符串。 - 查找:查找函数,如`find()`, `rfind()`, `find_first_of()`, `find_last_of()` ...

    c++ string类详解

    在使用 string 类之前,需要包含头文件 `#include &lt;string&gt;`。声明一个字符串变量很简单:`string Str;`。string 类有多种构造函数,包括: * `string s;` 生成一个空字符串 * `string s(str)` 拷贝构造函数,生成 ...

    巧用类String 的构造函数

    ### 巧用类String的构造函数 在C++编程中,自定义字符串类是一个非常典型的应用案例,尤其在深入理解类、对象以及内存管理等方面具有重要意义。本文将围绕一个简单的`String`类来探讨其构造函数及其成员函数的实现...

    C++_string详解

    要在C++程序中使用`string`类,首先需要包含`&lt;string&gt;`头文件: ```cpp #include &lt;string&gt; ``` 注意不要与C语言中的`string.h`混淆,后者包含了C语言中的字符串处理函数。 #### 声明`string`对象 声明一个`...

    C string深入详解2.0版_C++_string_

    `std::string`类在`&lt;string&gt;`头文件中定义,是C++标准模板库(STL)的一部分,极大地简化了字符串的操作。本篇文章将深入探讨`std::string`类的特性、构造、操作方法以及常见应用场景。 1. **构造与初始化** - 默认...

Global site tag (gtag.js) - Google Analytics