C++ 将字符串值赋给CHAR数组的实现

我就废话不多说啦,大家还是直接看代码吧~

CHAR name[50];
strcpy(name, "tagname");

补充:将char* 赋值给std::string的一些陷阱

这段时间,总是要使用char或者char* 赋值给std::string,踩了不少坑。于是写了个测试代码,如果你不想看我的代码,可以跳到下面直接看总结:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
  string str1;
  cout << "str1:" << str1 << " length: " << str1.length() << " size: " << str1.size() << " capacity: " << str1.capacity() << endl;

  string str2("hello");
  cout << "str2:" << str2 << " length: " << str2.length() << " size: " << str2.size() << " capacity: " << str2.capacity() << endl;

  string str3(4, 'A');
  cout << "str3:" << str3 << " length: " << str3.length() << " size: " << str3.size() << " capacity: " << str3.capacity() << endl;

  string str4(str2);
  cout << "str4:" << str4 << " length: " << str4.length() << " size: " << str4.size() << " capacity: " << str4.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  char sz1[10] = { 0 };
  sz1[0] = 'a';
  sz1[1] = 'b';
  sz1[2] = 'c';
  char sz2[10] = { 0 };
  sz2[0] = 'a';
  sz2[3] = 'b';
  sz2[4] = 'c';

  string str5(sz1);
  string str6(sz1, 2);
  string str71(sz1, 4);
  string str72(sz1, 10);
  string str73(sz1, 30);

  cout << "str5:" << str5 << " length: " << str5.length() << " size: " << str5.size() << " capacity: " << str5.capacity() << endl;
  cout << "str6:" << str6 <<" length: " << str6.length() << " size: " << str6.size() << " capacity: " << str6.capacity() << endl;
  cout << "str71:" << str71 << " length: " << str71.length() << " size: " << str71.size() << " capacity: " << str71.capacity() << endl;
  cout << "str72:" << str72 << " length: " << str72.length() << " size: " << str72.size() << " capacity: " << str72.capacity() << endl;
  cout << "str73:" << str73 << " length: " << str73.length() << " size: " << str73.size() << " capacity: " << str73.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str8(sz2);
  string str9(sz2, 1);
  string str10(sz2, 2);
  string str11(sz2, 4);
  string str12(sz2, 10);

  cout << "str8:" << str8 <<" length: " << str8.length() << " size: " << str8.size() << " capacity: " << str8.capacity() << endl;
  cout << "str9:" << str9 << " length: " << str9.length() << " size: " << str9.size() << " capacity: " << str9.capacity() << endl;
  cout << "str10:" << str10 << " length: " << str10.length() << " size: " << str10.size() << " capacity: " << str10.capacity() << endl;
  cout << "str11:" << str11 << " length: " << str11.length() << " size: " << str11.size() << " capacity: " << str11.capacity() << endl;
  cout << "str12:" << str12 << " length: " << str12.length() << " size: " << str12.size() << " capacity: " << str12.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str13 = sz1;
  string str14 = sz2;
  cout << "str13:" << str13 << " length: " << str13.length() << " size: " << str13.size() << " capacity: " << str13.capacity() << endl;
  cout << "str14:" << str14 << " length: " << str14.length() << " size: " << str14.size() << " capacity: " << str14.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str15;
  str15.append(sz1);
  string str16;
  str16.append(sz1, 2);
  cout << "str15:" << str15 << " length: " << str15.length() << " size: " << str15.size() << " capacity: " << str15.capacity() << endl;
  cout << "str16:" << str16 << " length: " << str16.length() << " size: " << str16.size() << " capacity: " << str16.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str17;
  str17.append(sz2);
  string str18;
  str18.append(sz2, 3);
  string str19;
  str19.append(sz2, 10);
  cout << "str17:" << str17 << " length: " << str17.length() << " size: " << str17.size() << " capacity: " << str17.capacity() << endl;
  cout << "str18:" << str18 << " length: " << str18.length() << " size: " << str18.size() << " capacity: " << str18.capacity() << endl;
  cout << "str19:" << str19 << " length: " << str19.length() << " size: " << str19.size() << " capacity: " << str19.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str20;
  str20 += sz1;
  string str21;
  str21 += sz2;
  cout << "str20:" << str20 << " length: " << str20.length() << " size: " << str20.size() << " capacity: " << str20.capacity() << endl;
  cout << "str21:" << str21 << " length: " << str21.length() << " size: " << str21.size() << " capacity: " << str21.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str22;
  str22.assign(sz1);
  string str23;
  str23.assign(sz1, 9);
  string str24;
  str24.assign(sz1, 15);
  cout << "str22:" << str22 << " length: " << str22.length() << " size: " << str22.size() << " capacity: " << str22.capacity() << endl;
  cout << "str23:" << str23 << " length: " << str23.length() << " size: " << str23.size() << " capacity: " << str23.capacity() << endl;
  cout << "str24:" << str24 << " length: " << str24.length() << " size: " << str24.size() << " capacity: " << str24.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  string str25;
  str25.assign(sz2);
  string str26;
  str26.assign(sz2, 4);
  string str27;
  str27.assign(sz1, 15);
  cout << "str25:" << str25 << " length: " << str25.length() << " size: " << str25.size() << " capacity: " << str25.capacity() << endl;
  cout << "str26:" << str26 << " length: " << str26.length() << " size: " << str26.size() << " capacity: " << str26.capacity() << endl;
  cout << "str27:" << str27 << " length: " << str27.length() << " size: " << str27.size() << " capacity: " << str27.capacity() << endl;

  cout << "-----------------------------------------------" << endl;

  printf("%s\n", str26.c_str());
  printf("%s\n", str26.data());

  return 0;
}

输出结果是:

现总结如下:

1. 将char*赋值给std::string如果不指定长度,则会默认以\0截断(ASCII码值为0);如果指定的长度超过char*字符串的长度,用std::cout系列的函数输出时,会把不属于该char*之后的内存值打印出来。而对于printf系列的函数来打印std::string时遇到\0也会截断,因而不能完全显示。这点在打印或输出到日志时,这类字符串时需要特别注意。

2. 如果是单个字符和一个字符串赋值给std::string写法是有区别的 —— 对于char,数目是第一个参数,对于char* 数目是第二个参数。

例如,假定ptsr是一个字符串或者字符。如果pstr是一个字符串,那么要写成string(pstr, n),如果pstr是一个字符,那么要写成string(n, pstr),而此时string(pstr, n)是一个错误的写法,可能会导致你的程序产生莫名其妙的问题,因为如果pstr是一个负值,负数转换成无符号整数size_t类型,n将非常大,会导致构造字符串时length非常大导致std::string构造时抛出异常。看这两种初始化的构造函数签名:

string (const char* s, size_t n);
string(size_t n, char c);

请注意这个区别!!特别容易想当然地写错。如果pstr对应数值比较小的正数,可能不会产生异常,但其实程序状态也不是你想要的。如果是负数,程序将直接产生异常。抛出:std::length_error 。所以出现这个异常信息,你就要好好检查下你初始化std::string的长度信息了。

(0)

相关推荐

  • C++ 实现输入含空格的字符串

    1.scanf函数(包含头文件#include <stdio.h>) scanf函数一般格式为scanf("%s",st),但scanf默认回车和空格是输入不同组之间的间隔和结束符号,所以输入带空格,tab或者回车的字符串是不可以的. 解决方法如下: 1. 利用格式符"%[]"它的作用为扫描字符集合. Scanf("%[^c]",str); 其中"c"是一个具体的字符常量(包括控制字符). 当输入字符串时,字符&q

  • C++ 删除字符串的2种方法小结

    C++实现删除给定字符串的给定字符串思路主要有这么几种实现方式: 1.KMP算法 2.用STL的string的 find,然后用erase 3.用C的strstr找到字串位置,然后用strncpy写到新串中 4.用boost库,用正则表达式 测试过的完整代码: 第一种方法: #include<iostream> #include <string> using namespace std; void deletestr(const char *str, const char* sub

  • C++获取字符串长度的几个函数方式

    C/C++ strlen(str).str.length().str.size().sizeof(str)都可以求字符串长度. 其中str.length().str.size().sizeof(str)是用于求string类对象的成员函数 strlen(str)是用于求字符数组的长度,其参数是char*. 补充知识:获取字符串长度的函数sizeof().strlen().length().size()详解和区别 在C++中计算长度的函数有四种,它们分别是sizeof() ,size(),strl

  • C++ string字符串的修改与替换方法详析

    字符串内容的变化包括修改和替换两种.本节将分别讲解字符串内容的修改和字符串内容的替换. 字符串内容的修改 可以通过使用多个函数修改字符串的值.例如 assign(),operator=,erase(),交换(swap),插入(insert)等.另外,还可通过 append() 函数添加字符. 下面逐一介绍各成员函数的使用方法. assign()函数 使用 assign() 函数可以直接给字符串赋值.该函数既可以将整个字符串赋值给新串,也可以将字符串的子串赋值给新串.其在 basic_string

  • 详解C++字符串常用操作函数(查找、插入、截取、删除等)

    1. 字符串查找函数 1.1 find 函数 原型为:unsigned int find(const basic_string &str) const; 作用:查找并返回str在本串中第一次出现的位置,位置从0开始 例子如下: #include <iostream> using namespace std; int main() { string str = "i love china. china love me"; string find_str = "

  • C++ 字符串string和整数int的互相转化操作

    一.string转int的方式 1.采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 2.采用标准库中atoi函数. string s = "12"; int a = atoi(s.c_str()); 对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等. 3.采用sstream头文件中定义的字符串流对象来实现转换. istringstream is("12"); //构造输

  • C++处理输入字符串并转为数组的操作

    最近在做题的时候在处理输入时遇到一个令人头疼的问题,今天解决了和大家分享一下: 比如题目要求的输入为一行数,数与数之间用空格间隔开,数的个数未知,数也有正有负: 11 -2 65 7 那么如何把这个输入保存到数组a中,且数组a中的值为a[0]=11,a[1]=-2,a[3]=65,a[4]=7呢? 先看代码: #include <iostream> #include <stdio.h> using namespace std; int main() { int a[20]; int

  • C++ 将字符串值赋给CHAR数组的实现

    我就废话不多说啦,大家还是直接看代码吧~ CHAR name[50]; strcpy(name, "tagname"); 补充:将char* 赋值给std::string的一些陷阱 这段时间,总是要使用char或者char* 赋值给std::string,踩了不少坑.于是写了个测试代码,如果你不想看我的代码,可以跳到下面直接看总结: #include <string> #include <iostream> using namespace std; int ma

  • Java中char数组(字符数组)与字符串String类型的转换方法

    本文实例讲述了Java中char数组(字符数组)与字符串String类型的转换方法.分享给大家供大家参考,具体如下: 在Java语言编程时,使用"口令字段"jPasswordField组件时,如果要获得密码值,就需要使用该组件的getPassword()方法.jPasswordField的getPassword()方法返回一个char类型的数组,我们经常需要将这个数组转换为String类型,以便进行诸如口令匹配或口令赋值等操作.这时,就需要将char类型的数组进行转换.当然也经常会遇到

  • PHP list() 将数组中的值赋给变量的简单实例

    list() PHP list() 用一步操作把数组中的值赋给一些变量.同 array() 一样,list() 不是真正的函数,而是语言结构. 语法: void list( mixed var, mixed ... )注意: list() 仅能用于数字索引的数组并假定数字索引从 0 开始. 例子1: <?php $arr_age = array(18, 20, 25); list($wang, $li, $zhang) = $arr_age; echo $wang; //输出:18 echo $

  • C#字符串String及字符Char的相关方法

    一.字符串: 1.访问String中的字符: string本身可看作一个Char数组. string s = "hello world"; for (int i = 0; i < s.Length; i++) { Console.WriteLine(s[i]); } //或者 foreach (char c in s) { Console.WriteLine(c); } 打散为字符数组(ToCharArray) string s = "Hello World"

  • C++编程之CString、string与、char数组的转换

    C++编程之CString.string与.char数组的转换 虽然网上关于CString,string,char数组的转换的文章一大堆,但是感觉很乱很杂,而且许多并不能真正达到目的,在此,我把自己调试通过的转换方法贴到这里,做个笔记. 编译环境:vs2008, Use Unicode Character Set //----------------ANSI字符串转换为UNICODE字符串----------------------// // 待转换的数组 char szDCBparam[50]

  • 详解C语言结构体中的char数组如何赋值

    目录 前景提示 一.char数组类型的处理 1.结构体初始化 2.结构体内数据赋值(简单法) 二.char数组指针类型的处理 1.结构体初始化 2.结构体内数据赋值 3.结构体内输出数据 三.全部代码 1.char数组 2.char数组指针 总结 前景提示 定义一个结构体,结构体中有两个变量,其中一个是char类型的数组,那么,怎么向这个数组中插入数据,打印数据呢? typedef struct SequenceList { // 数组的元素 char element[20]; // 数组的长度

  • PHP按指定键值对二维数组进行排序的方法

    本文实例讲述了PHP按指定键值对二维数组进行排序的方法.分享给大家供大家参考,具体如下: 问题: 有数组: 复制代码 代码如下: array(0=>array('id'=>1,'price'=>50),1=>array('id'=>2,'price'=>60)); 要求根据数组的price这个字段进行排序. 实现代码如下: <?php $array[] = array('id'=>1,'price'=>50); $array[] = array('id

  • php each 返回数组中当前的键值对并将数组指针向前移动一步实例

    each函数返回数组中当前的键/值对并将数组指针向前移动一步 基本语法 array each ( array &$array ) 在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元.如果要再用 each 遍历数组,必须使用 reset() . 参数介绍: 参数 描述 array 必需.规定要使用的数组. each() 函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动. 返回值: 返回 array 数组中当前指

  • JavaScript使用encodeURI()和decodeURI()获取字符串值的方法

    本文实例讲述了JavaScript使用encodeURI()和decodeURI()获取字符串值的方法.分享给大家供大家参考.具体如下: JavaScript使用encodeURI()和decodeURI()获取字符串值,不能就是地址栏显示的字串,以前经常在网上见到有人问此问题,无意在网上发现,不知是不是您想要的,先看看效果吧. 先来看看运行效果: 具体代码如下: <html> <head> <meta http-equiv="Content-Type"

  • php把字符串指定字符分割成数组的方法

    实例如下: <?php $str="1|2|3|4|5|"; $var=explode("|",$str); print_r($var); ?> $var=explode("|",$str); 把$str按|进行分割 php还有其他的把字符串指定字符分割成数组 str_split(string,length) 参数 描述 string 必需.规定要分割的字符串. length 可选.规定每个数组元素的长度.默认是 1. json_de

随机推荐