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

C风格字符串:本质上就是以空字符null为结束符的数组

可以简单的理解为:有‘\0‘的是c风格字符串,无‘\0‘的是普通字符数组

字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示。

C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错)

由下面的代码可以看出:

int main()
{
    char str1[5] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘};
    char str2[6] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘};
    //char str3[5] = "Hello";              //error
    char str4[6] = "Hello";
    cout << sizeof(str1) << endl; //5
    cout << sizeof(str2) << endl; //6
    cout << strlen(str1) << endl; //19
    cout << strlen(str2) << endl; //5
    cout << strlen(str4) << endl; //5
    cout << str1 << endl;          //Hell0烫烫烫潭9媭?
    cout << str2 << endl;          //Hell0
    cout << str4 << endl;          //Hell0
    char str5[12] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘};
    char str6[] = {‘H‘,‘e‘,‘l‘,‘l‘,‘0‘};
    cout << sizeof(str5) << endl; //12
    cout << sizeof(str6) << endl; //5
    cout << str5 << endl;          //Hell0
    cout << str6 << endl;          //Hell0烫烫烫潭9媭?
    char str7[12] = "Hello";
    char str8[] = "Hello";
    cout << sizeof(str7) << endl; //12
    cout << sizeof(str8) << endl; //6
    cout << strlen(str8) << endl; //5
    string str9 = "Hello";
    cout << str9.size() << endl;  //5
}

写成“Hello”形式时,都必须给‘\0‘预留空间(必须有),要不然会直接报错,其sizeof大小为6,但是其strlen为5(说明这种形式的时候会自动加一个‘\0‘,sizeof是求变量占用空间,因此带上‘\0‘大小,strlen是只计算有效字符个数,null之前字符个数)

如果char *数组大小和字符个数相等时(或者未显示分配大小):分开来写成{‘H‘,‘e‘,‘l‘,‘l‘,‘0‘}形式时,其数组大小可以直接和字符个数相等,其sizeof就是字符个数,不会自动补齐‘\0’,但是打印或者处理的时候,因为找不到结束符,因此会处理到其他内存的内容,有很大的隐患。

如果char *数组大小大于字符个数,则也会补一个‘\0’

因此以char *形式处理字符串的时候一定要注意结束符以及是否溢出,如果空间预留过大又浪费空间

而且修改或者特殊查询的时候还得创建副本

而string则不需要注意这些,空间对象如何分配,是否要创建副本由类内部处理,用户可以当作普通变量处理,而且string作为c++标准库,有很多方法都有现成的,直接在API上就可以查询到,方便快捷

时间: 2024-10-10 15:16:17

c风格字符串,字符串字面值,c++字符串的相关文章

C#中字符串的字面值(转义序列)

在程序开发中,经常会碰到在字符串中字面值中使用转义序列,下面表格收集了下转义序列的完整列表,以便大家查看引用: 转义序列列表 转义序列 产生的字符 字符的Unicode值 \' 单引号 0x0027 \" 双引号 0x0022 \\ 反斜杠 0x005C \0 空 0x0000 \a 警告(产生蜂鸣) 0x0007 \b 退格 0x0008 \f 换页 0x000C \n 换行 0x000A \r 回车 0x000D \t 水平制表符 0x0009 \v 垂直制表符 0x000B 表中的“Uni

C#给字符串赋予字面值——字符串插入、转义序列的使用

1.占位符.字符串插入 给字符串赋予字面值时,经常遇见在字符串中包含变量的情况,用连接符进行拼接.转换的方式比较麻烦.还容易出错.C#提供了较为便捷的处理方式,即'占位符',以及C#6的新功能'插入字符串'(没记错的话是VS2015及后续新版本可用该功能).下面举个简单的例子说明用法: string a="A friend in need"; string b="a friend indeed."; 想要输出A friend in need is a friend

区分/不区分大小写的比较,查找字符串在另一字符串中的位置,字符串开头是否包括另一字符串 hasPrefix

NSString *str; // 使用stringWithFormat生成一格式化字符串 str = [NSString stringWithFormat:@"This is %@","John"]; NSLog(@"str--->%@",str); // 字符串长度length; NSLog(@"The length of this string is %@",[str length]); // 字符串比较 isEq

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

博客主页: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语言】将一个数字字符串转换成这个字符串对应的数字(包括正浮点数、负浮点数)

#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 的字符串

输入一个字符串,输出该字符串中对称的子字符串的最大长度。

public class LongestSymmtricalLength2 { /* * Q75题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度. * 比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4. */ public static void main(String[] args) { String[] strs = { "a","google", "elgoog", "agol