C风格字符串与C++风格字符串

C风格字符串与C++风格字符串

C风格字符串:对字符串进行操作的 C 函数定义在头文件<cstring>中;

1. 字符串定义:char* result;

2. 字符串的最后一个字符是null字符(‘\0‘),可以通过这个字符确定字符串的结尾。

3. strlen()返回的是字符串的大小;因此,分配空间的时候,需要比字符串的实际空间大1.

e.g. char* copyString(const char* inString)

{

char *result = new char[strlen(inString)];//BUG! off by one

strcpy(result, inString);

return result;

}

explain: strlen()返回的是字符串的大小,比如"ab",返回的是2。而在new进行分配的时候,需要为‘\0‘分配一个空间。分配语句要写作,char *result = new char[strlen(inString) + 1];

4. strcpy(a,b):将字符串b的内容赋值给字符串a;a的大小可以大于b,将b放在a的开始的位置;

strcat(a,b):将字符串b拼接到字符串a的现有字符后面;

C++风格字符串:使用C++风格字符串的时候,要将它当做是一个普通的类型,如int,这样反而会避免将string作为一个类来理解所带来的很多问题。

1. 支持<cstring>中许多函数完成的同样操作。

2. 字符串定义:string myString = “hello”;

3. 操作符 = :复制字符串;比如,string newone = original;会将后者复制给前者,不会出现两个变量同样指向一个内存的情况。

4. 可以像int一样使用 == 之类的操作符

5. 可以改变字符串中的某一个字符。 如 string myString = "hello"; mystring[0] = ‘l‘; 这中操作是允许的。

字符串直接量:字符串没有变量名字,自身表示自身。

1. string literal:字符串直接量: e.g. cout<<"hello"<<endl; 代码中通过包含"hello"字符串自身来将其输出,并未包含该字符串的变量。

2. 字符串直接量可以赋值给变量,但是与字符串直接量相关联的内存空间位于只读部分,因此它是常量字符数组。

char* ptr = "hello";

ptr[1] = ‘a‘;//crash! attemps to write to read-only memory.

因此,当引用字符串直接量的时候使用指向const的字符数组:

const char* ptr = "hello";

ptr[1] = ‘a‘;//bug! attempts to write to read-only memory.

3. 当将字符串直接量赋值给字符数组的初始值的时候。由于字符数组存放与栈中,不允许引用其他地方的内存,因此编译器会将字符串直接量复制到站的数组内存中。因此,可以进行相应的修改。

char  stackArray[] = "hello";

stackArray[1] = ‘a‘;

时间: 2024-10-12 22:36:16

C风格字符串与C++风格字符串的相关文章

string字符串转C风格字符串 进而转换为数字

要求如题 头文件stdlib.h中有一个函数atof() 可以将字符串转化为双精度浮点数(double) double atof(const char *nptr); 此字符串为C风格字符串,因此需要将string转化为C风格字符串 此时可用到一个函数c_str() const char *c_str() 参考资料: string中c_str().data().copy(p,n)函数的用法 在使用c_str()时遇到了一个问题–此函数的返回值为const char * 因为是const数据类型,

camel-name-utils 在驼峰风格跟下划线风格之间切换

用处 用来将字符串在驼峰风格跟下划线风格之间切换.对于一般人可能没用,对于写orm框架的人有点作用. 例子: company_name -> companyName 安装方式 添加以下依赖到pom.xml <dependency> <groupId>org.crazycake</groupId> <artifactId>camel-name-utils</artifactId> <version>1.0.0-RELEASE<

驼峰字符串与下划线字符串之间相互转化工具

博客主页:http://blog.csdn.net/minna_d 起因: 我们经常会有驼峰字符串与下划线字符串相互转化的需求, 而且这个还不好之间用正则替换. 比如:db 表中命名风格通常为下划线风格, web应用pojo中通常有时驼峰风格. 如果字段太多,总觉得很麻烦 实现: cm2us.py: #!/bin/python import re import sys def camelToUnderlines(x):     return re.sub('_([a-z])', lambda m

C/C++判断字符串是否包含某个字符串

C风格 #include <iostream> #include <string> #include <cstring> using namespace std; int main() { string a="abcdefghigklmn"; char *b="def"; char *c="123"; if(strstr(a.c_str(), b) == NULL)//在a中查找b,如果不存在, cout &l

c风格字符串,字符串字面值,c++字符串

C风格字符串:本质上就是以空字符null为结束符的数组 可以简单的理解为:有'\0'的是c风格字符串,无'\0'的是普通字符数组 字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示. C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错) 由下面的代码可以看出: int main()

【C语言】将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)

#include <stdio.h> /* 编写一个函数,将一个数字字符串转换成这个字符串对应的数字(包括正浮点数.负浮点数) 例如:"12.34" 返回12.34 "-123.34" 返回-123.34 函数原型:double my_atof(char *str) {} */ double my_atof(char *str) { double m=0,n=0,x=1; int flag=1; int flag2=0; if(*str=='-') //

【C语言】编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数、负整数)

/* 编写一个函数,将一个数字字符串转换成该字符串对应的数字(包括正整数.负整数) 例如:"12" 返回12 "-123" 返回-123 函数原型:int my_atof(char *str) */ #include <stdio.h> int my_atof(char *str) { int flag=0; int m=0; if(*str=='-') { flag=1; str++; } while(*str!='\0') { if(*str<

Java实现统计某字符串在另一个字符串中出现的次数

面试时会经常考这样的题目,估计也不让使用正则表达式.还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧. 下面是实现代码: /** * 统计某字符串在另一个字符串中出现的次数 * * */ public class CountHit { public static void main(String[] args) { String a = "123456abcde6ab"; String b = "6abc"

【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 分析:如果出现循环,则返回错误 这句不懂 具体做法是先给每个字符串建一个vector 存入每个字符串后面可以匹配的字符串序号 然后遍历所有的搭配情况,找到最长的. 我的遍历代码很丑... 可谓又臭又长..... 深深的自我鄙视. /* 37.(字符串) 有 n 个长为 m+1 的字符串