c++字符串用法,C++ 字符串函数
最近遇到一个C项目,准备学习一些关于C的知识,由于我的大部分C语言知识已经还给老师了(什么指针的指针.),而且本人从事java相关开发多年,看了一天发现C的坑真的很大,没有急功近利,只能一点一点的啃。本文将记录刚刚遇到的字符串问题。
开始代码:
#包含stdio.h
班级学生{
公共:
char *name=javaname . ;
char ADRs[5]= test ;
int age=1;
浮动分数=0.5;
void say(){
printf(%s年龄为:%d,分数为:%f\n ,姓名,年龄,分数);
}
};
int main() {
班级学生stu
stu.name=小明;
str . ADRs[0]= a ;
stu . age=2;
stu.score=98.9
stu . say();
返回0;
}编译,运行:
[roo@localhost ~]$ g abc.cpp
abc.cpp:4:13:警告:非静态数据成员初始值设定项仅适用于-std=c 11或-STD=GNU 11[默认情况下启用]
char * name= javaname
^
abc.cpp:5:15:警告:非静态数据成员初始值设定项仅适用于-std=c 11或-STD=GNU 11[默认情况下启用]
char ADRs[5]= test ;
^
abc.cpp:6:12:警告:非静态数据成员初始值设定项仅适用于-std=c 11或-STD=GNU 11[默认情况下启用]
int age=1;
^
abc.cpp:7:14:警告:非静态数据成员初始值设定项仅适用于-std=c 11或-STD=GNU 11[默认情况下启用]
浮动分数=0.5;
^
abc.cpp:4:13:警告:已弃用从字符串常量到“char*”的转换[-ww write-strings]
char * name= javaname
^
abc.cpp:在函数“int main()”中:
abc.cpp:15:11:警告:已弃用从字符串常量到 char * [-wwwrite-strings]的转换
stu.name=小明;
^
//默认生成一个. out可执行文件
[roo@localhost ~]$。/a.out
小明年龄是:2,分数是:98.900002,地址:aest。结合这个例子,我们来总结一下c中与字符串相关的知识点。
I .字符数组定义字符串:
在C中,没有特殊的字符串变量,只能将字符串作为字符数组处理。在变量中存储字符串,必须使用字符数组,即用字符数组存储字符串,数组中的每个元素存储一个字符。
一般我们用字符数组存储字符串的时候,首先要确定一个足够大的数组,但实际上我们用不了那么多,我们只关心它的有效位。c已经指定了一个“/0”来表示字符串的结尾。“/0”会自动添加到系统字符串常量中作为终止符。
先看一个例子:
#包括iostream
#包括cstring
使用命名空间std
int main()
{
char a[10]= hello ;
cout sizeof(a)endl;//10
char b[]= hello ;
cout sizeof(b)endl;//6
char c[10]={h , e , l , l , o };
cout sizeof(c)endl;//10
char d[]={h , e , l , l , o };
cout sizeof(d)endl;//5
char e[10];
strcpy(e, hello );
cout strcpy: sizeof(e)endl;//10
}1)字符数组以三种方式定义字符串:
定义的时候直接用字符串赋值:char a[10]= hello ;而char a[]= hello ;一样的,不同的是sizeof大小不一样,字符数组中的字符是一个一个赋值的;char c[10]={h , e , l , l , o };使用strcpy: strcpy (e, hello );解释:# includechtring头文件需要引入才能使用strcpy,否则编译会报错,错误:“strcpy”未在此范围内声明。
注意:char a[10]= hello ;而char a[]= hello ;一样的,但是在class类中给属性赋值的时候,只能用前者,否则会报错。例如,下面的方法将报告一个错误。错误:字符数组的初始值设定项字符串太长[-fpermissive]
班级学生{
公共:
char *name=javaname . ;
char ADRs[]= test ;
int age=1;
浮动分数=0.5;
void say(){
printf(%s年龄为:%d,分数为:%f\n ,姓名,年龄,分数);
}
};2)单引号和双引号:
前者是字符,后者是字符串。由单引号引起的字符大小是一个字节。双引号引起的字符串大小是字符1的总大小,因为双引号引起的字符串会在字符串末尾加上一个二进制0字符 \0 。
二。字符指针定义字符串:
Char*是一个字符串的指针(实际上严格来说是一个字符串的第一个字母)。你可以让它指向一串常量字符串。用char*定义一个字符串,不能改变字符串中字符的内容,但是可以付给它另一个字符串。请看下面的例子:
#包括iostream
使用命名空间std
int main()
{
char str[]= hello world ;
char * p=str
cout str endl
cout p endl
cout * p endl
char * str1= java
cout str1 endl
cout * str1 endl
str1= C
cout str1 endl
}
输出:
你好世界
你好世界
h
爪哇岛
j
1.char *str和char str[]的区别:
使用char*定义字符串不能改变字符串中字符的内容。
#包含stdio.h
int main()
{
char * str= hello C
printf(%s\n ,str);//你好C
str[0]= 1 ;//报告错误
char str 3[]= sfdsdfdsfdsfdsfdsf ;
str 3[0]= 1 ;
printf(%s\n ,str 3);//1fdsdfdsfdsfdsfdsf
char str 4[6]= 12345 ;
str 4[0]= a ;
printf(%s\n ,str 4);//a2345
}注意:char指针*位置可以放在任何地方。例:char *str,char* str,char * str都一样。
2.内存结构:
下面这个问题,因为字符指针char *str指向一个字符串常量的地址,既然是常量,那么它的值一定不能重写!所以代码中所有给str[]赋值的语句都是非法的!看一个例子:
#包括iostream
使用命名空间std
int main()
{
char * cards= JQK
char a _ card=cards[0];
cout a _ card endl//J
卡片[2]=卡片[1];//报告错误
cards[1]= x ;//报告错误
}
首先,编译器将字符串JQK常量存储在内存数据段的代码中。这段代码定义了一个字符指针变量卡片,所以编译器在堆栈空间中给它分配了一个单元。将数据段中代码字符串JQK的第一个地址赋给cards,即让cards指向数据段中的字符串JQK。代码要求取出字符串中的第二个字符,并将其值赋给字符串中的第三个字符单元。这里有一个问题,因为字符串所在的单元是只读的,不能写。所以我们在给指针赋字符串常量的时候,通常会用const关键字来限制,即const char * name= leon
1)程序内存分配:
c/C编译程序占用的内存分为以下几部分:
堆栈:由编译器自动分配和释放,存储函数的参数值、局部变量的值等。它像数据结构中的堆栈一样工作。堆:一般由程序员分配和释放。如果程序员不释放它,它可能在程序结束时被OS恢复。全局(静态):全局变量和静态变量存储在一起,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和未初始化的静态变量在另一个相邻区域。程序完成后,由系统释放。常量区域:常量字符串放在这里。程序完成后,由系统释放。代码区//main.cpp
#包含stdio.h
#包含字符串. h
int a=0;//全局初始化区域
char * p1//全局未初始化区域
主()
{
int b;棚
char s[]= ABC ;//堆栈
char * p2//堆栈
}2)堆和栈的基础知识:
Stack:由系统自动赋值,比如在函数中声明了一个局部变量int b;系统自动在栈中为B打开空间。
堆:需要程序员自己申请,并注明大小。C中的malloc函数,C中的new运算符P1=(char *)malloc(10);请注意,p1本身在堆栈中。
三。字符串类:
在c中,char仍然是一个原语类型,而string已经被封装成了一个类。使用的时候需要#include string,这是C标准库的一部分。
它包含了对字符串的各种常见操作。与char*相比,它的优点是内容可以动态扩展,操作字符串方便快捷。用数字连接字符串是最常见的操作。
与字符指针不同,C中字符串的定义可以改变字符串中的字符,或者你可以付给它另一个字符串。
#包括iostream
使用命名空间std
int main()
{
string str= hello java
cout str endl
str= hello C
cout str endl
str[0]= 1 ;
cout str endl
}
输出:
你好java
你好C
1ello C描述:
1)在c中使用string需要使用命名空间std除了头文件之外;否则会被举报,因为1998年以后的C语言提供了全局命名空间,可以避免全局命名冲突的问题。C标准库定义了命名空间:std,包含容器向量、字符串等。
2)C代码中使用printf(%s ,str);当格式类似于字符串类型时,会报告一个错误:无法通过varidic函数传递非pod类型“string”(又名“basic _ string char”)的对象。原因是当printf,scanf,fprinf等。可以在字符串格式中使用“%s”,但只能使用cstring。如果是C字符串,必须改成CString:str . C _ str();
原创作品来自正在路上的博主,转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。