c++ string类详解
C++中针对C语言中处理字符串的难题,在标准库中设计了string类,因此现在编程中涉及到字符串的处理,就可以直接使用string类了。
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。
我们可以用=进行赋值操作,==进行比较,+做串联(是不是很简单?)。
我们尽可以把它看成是C++的基本数据类型。
首先,为了在我们的程序中使用string类型,我们必须包含头文件。
如下:#include<string>//注意这里不是string.h string.h是C字符串头文件1.声明一个C++字符串声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。
上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。
String类的构造函数和析构函数如下:a)string s;//生成一个空字符串sb)string s(str)//拷贝构造函数生成str的复制品c)string s(str,stridx)//将字符串str内“始于位置stridx”的部分当作字符串的初值d)string s(str,stridx,strlen)//将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值e)string s(cstr)//将C字符串作为s的初值f)string s(chars,chars_len)//将C字符串前chars_len个字符作为字符串s的初值。
g)string s(num,c)//生成一个字符串,包含num个c字符h)string s(beg,end)//以区间beg;end(不包含end)内的字符作为字符串s的初值i)s.~string()//销毁所有字符,释放内存都很简单,我就不解释了。
2.字符串操作函数这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。
a)=,assign()//赋以新值b)swap()//交换两个字符串的内容c)+=,append(),push_back()//在尾部添加字符d)insert()//插入字符e)erase()//删除字符f)clear()//删除全部字符g)replace()//替换字符h)+//串联字符串i)==,!=,<,<=,>,>=,compare()//比较字符串j)size(),length()//返回字符数量k)max_size()//返回字符的可能最大个数l)empty()//判断字符串是否为空m)capacity()//返回重新分配之前的字符容量n)reserve()//保留一定量内存以容纳一定数量的字符o)[],at()//存取单一字符p)>>,getline()//从stream读取某值q)<<//将谋值写入streamr)copy()//将某值赋值为一个C_strings)c_str()//将内容以C_string返回t)data()//将内容以字符数组形式返回u)substr()//返回某个子字符串v)查找函数w)begin()end()//提供类似STL的迭代器支持x)rbegin()rend()//逆向迭代器y)get_allocator()//返回配置器下面详细介绍:2.1C++字符串和C字符串的转换C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。
c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string 或字符数组内。
C++字符串并不以’\0’结尾。
我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
由于只是简单介绍,详细介绍掠过,谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。
我详细解释。
2.2大小和容量函数一个C++字符串存在三种大小:a)现有的字符数,函数是size()和length(),他们等效。
Empty()用来检查字符串是否为空。
b)max_size()这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。
我们一般情况下不用关心他,应该大小足够我们用的。
但是不够用的话,会抛出length_error 异常c)capacity()重新分配内存之前string所能包含的最大字符数。
这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。
重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。
还有必要再重复一下C++字符串和C字符串转换的问题,许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。
那么,这时候我们的处理方式是:如果此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(),(char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。
当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。
同时我们也祈祷现在仍然使用C字符串进行编程的高手们(说他们是高手一点儿也不为过,也许在我们还穿开裆裤的时候他们就开始编程了,哈哈…)写的函数都比较规范,那样我们就不必进行强制转换了。
2.3元素存取我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。
但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。
而at()会检查,如果使用at()的时候索引无效,会抛出out_of_range异常。
有一个例外不得不说,const string a;的操作符[]对索引值是a.length()仍然有效,其返回值是’\0’。
其他的各种情况,a.length()索引都是无效的。
举例如下:const string Cstr(“const string”);string Str(“string”);Str[3];//okStr.at(3);//okStr[100];//未定义的行为Str.at(100);//throw out_of_rangeStr[Str.length()]//未定义行为Cstr[Cstr.length()]//返回‘\0’Str.at(Str.length());//throw out_of_rangeCstr.at(Cstr.length())////throw out_of_range我不赞成类似于下面的引用或指针赋值:char&r=s[2];char*p=&s[3];因为一旦发生重新分配,r,p立即失效。
避免的方法就是不使用。
2.4比较函数C++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string 的比较(如str<”hello”)。
在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。
字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。
同时,string(“aaaa”)另一个功能强大的比较函数是成员函数compare()。
他支持多参数处理,支持用索引值和长度定位子串来进行比较。
他返回一个整数来表示比较结果,返回值意义如下:0-相等〉0-大于<0-小于。
举例如下:string s(“abcd”);pare(“abcd”);//返回0pare(“dcba”);//返回一个小于0的值pare(“ab”);//返回大于0的值pare(s);//相等pare(0,2,s,2,2);//用”ab”和”cd”进行比较小于零pare(1,2,”bcx”,2);//用”bc”和”bc”比较。
怎么样?功能够全的吧!什么?还不能满足你的胃口?好吧,那等着,后面有更个性化的比较算法。
先给个提示,使用的是STL的比较算法。
什么?对STL一窍不通?靠,你重修吧!2.5更改内容这在字符串的操作中占了很大一部分。
首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns)、c_string(如:s=”gaint”)甚至单一字符(如:s=’j’)。
还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。
还是举例说明吧:s.assign(str);//不说s.assign(str,1,3);//如果str是”iamangel”就是把”ama”赋给字符串s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给ss.assign(“gaint”);//不说s.assign(“nico”,5);//把’n’‘I’‘c’‘o’‘\0’赋给字符串s.assign(5,’x’);//把五个x赋给字符串把字符串清空的方法有三个:s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂!)。
string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。
先说增加字符(这里说的增加是在尾巴上),函数有+=、append()、push_back()。
举例如下:s+=str;//加个字符串s+=”my name is jiayp”;//加个C字符串s+=’a’;//加个字符s.append(str);s.append(str,1,3);//不解释了同前面的函数参数assign的解释s.append(str,2,string::npos)//不解释了s.append(“my name is jiayp”);s.append(“nico”,5);s.append(5,’x’);字符串操作是一个不小的主题,在标准C++中,string字符串类成为一个标准,之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下的需要.。
C语言--字符串详解
C语⾔--字符串详解 字符串是⼀种⾮常重要的数据类型,但是C语⾔不存在显式的字符串类型,C语⾔中的字符串都以字符串常量的形式出现或存储在字符数组中。
同时,C 语⾔提供了⼀系列库函数来对操作字符串,这些库函数都包含在头⽂件 string.h 中。
⼀、字符串常量和字符数组1.1、什么是字符串常量 C 语⾔虽然没有字符串类型,但是 C语⾔提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。
字符串常量是不可被修改的,⼀般⽤⼀对双引号(" ")括起的⼀串字符来表⽰字符串常量,如: "Hello!"、"\aWarning!\a"、"123abc\n"、"" 字符串常量可以为空,如""就是⼀个空的字符串常量,但是即使为空,还是存在⼀个终⽌符 NUL 的。
(在 C 语⾔中,常⽤转义字符 \0来表⽰ NUL)1.2、字符串常量与指针 字符串常量与指针关系密切,因为字符串常量的值,实际上表⽰的是存储这些字符的内存空间的地址,更准确地说是字符串常量中第 1个字符的地址,⽽不是这些字符本⾝。
因此,在 C 语⾔中是不能直接进⾏字符串赋值的(因为没有字符串类型嘛)。
在 C 语⾔中,常通过声明⼀个指向 char 类型的指针并将其初始化为⼀个字符串常量的⽅式来访问⼀个字符串:char *message = "Hello World!";// 上⾯的语句也可以拆分成下⾯两句char *message;message = "Hello World!"; // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作 上述语句声明了⼀个指向 char 类型的指针,并⽤字符串常量中第 1 个字符的地址对该指针进⾏初始化。
可以通过字符指针 message 来访问字符串常量:#include <stdio.h>int main(){ char *message = "Hello World!"; printf("%s\n",message); while(*message != '\0'){ printf("%c ",*message++); } printf("\n"); return0;}/* output:* Hello World!* H e l l o W o r l d !*/ 这段代码,使⽤字符指针遍历了字符串常量中的每⼀个字符。
C语言指针的长度和类型详解
C语言指针的长度和类型详解C语言指针的长度和类型详解指针是C语言的精髓,以下是店铺搜索整理的关于C语言指针的长度和类型详解,对于初学者深入理解C语言程序设计有很好的参考价值,有需要的朋友可以参考一下!想了解更多相关信息请持续关注我们店铺!一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。
但是函数指针长度可能与数据指针的长度不同。
指针的长度取决于使用的机器和编译器,例如:在现代windows 上,指针是32位或是64位长测试代码如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<stddef.h>struct p{int n;float f;};int main(){struct p *sptr;printf("sizeof *char: %d ", sizeof(char*));printf("sizeof *int: %d ", sizeof(int*));printf("sizeof *float: %d ", sizeof(float*));printf("sizeof *double: %d ", sizeof(double*));printf("sizeof *struct: %d ", sizeof(sptr));return 0;}运行结果如下图所示:指针相关的预定义类型:① size_t:用于安全地表示长度② ptrdiff_t:用于处理指针算术运算③ intptr_t:用于存储指针地址④ uintptr_t:用于存储指针地址分述如下:一、size_t类型size_t 类型是标准C库中定义的,应为unsigned int,在64位系统中为long unsigned int。
深入学习C++_String2.1版
目录
目录 1
正文 4
一、 C++的string的使用 4
1.1 C++ string简介 4
1.2 string的成员 4
1.2.1 append 4
1.2.2 assign 5
1.2.3 at 5
1.2.4 begin 6
1.2.5 c_str 6
1.2.6 capacity 6
一、 C++的string的使用
1.1 C++ string简介
C++兼容C对字符串的处理方式,与此同时还在标准库(STL)中提供了string 容器,我们可以很容易的使用string来进行字符串处理。而且string还能很好的与标准库中的泛型算法结合起来使用,非常的方便。虽然在MFC等框架中也提供了诸如CString这样的字符串处理类,但是个人认为STL的string依然是最棒 的,使用标准库提供的string可以轻松的与原来的C API兼容 ,也可以很好的与系统底层的API兼容。
声明:
本文中选择的源码为MSSTL和boost1.37,例子为作者亲手所写,如果代码来自网络或者其它地方我会尽量声明出处。人难免会有疏漏,所以可能会有照顾不周的地方,我也无意侵害您的权益,如果您发现了这样的情况在本文档中出现,请您通知我,我保证马上更正。本文中凡是作者原创的内容,您可以随意修改与使用,欢迎您传播。
basic_string<CharType, Traits, Allocator>& append(
const_pointer _First,
const_pointer _Last
转:std::string用法详解
转:std::string用法详解前言: string 的角色1 string 使用1.1 充分使用string 操作符1.2 眼花缭乱的string find 函数1.3 string insert, replace, erase 2 string 和 C风格字符串3 string 和 Charactor Traits4 string 建议5 附录前言: string 的角色1、 string 使用其实,string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 你在string 头文件中你会发现下面的代码:extern "C++" {typedef basic_string <char> string;typedef basic_string <wchar_t> wstring;} // extern "C++"由于只是解释string的用法,如果没有特殊的说明,本文并不区分string 和 basic_string的区别。
string 其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还有包含了所有的序列容器的操作。
字符串的常用操作包括:增加、删除、修改、查找比较、链接、输入、输出等。
详细函数列表参看附录。
不要害怕这么多函数,其实有许多是序列容器带有的,平时不一定用的上。
如果你要想了解所有函数的详细用法,你需要查看basic_string,或者下载STL编程手册。
这里通过实例介绍一些常用函数。
1.1 充分使用string 操作符string 重载了许多操作符,包括 +, +=, <, =, , [], <<, >>等,正式这些操作符,对字符串操作非常方便。
先看看下面这个例子:tt.cpp(例程2)#i nclude <string>#i nclude <iostream>using namespace std;int main(){string strinfo="Please input your name:";cout << strinfo ;cin >> strinfo;if( strinfo == "winter" )cout << "you are winter!"<<endl;else if( strinfo != "wende" )cout << "you are not wende!"<<endl;else if( strinfo < "winter")cout << "your name should be ahead of winter"<<endl;elsecout << "your name should be after of winter"<<endl;strinfo += " , Welcome to China!";cout << strinfo<<endl;cout <<"Your name is :"<<endl;string strtmp = "How are you? " + strinfo;for(int i = 0 ; i < strtmp.size(); i ++)cout<<strtmp[i];return 0;}下面是程序的输出-bash-2.05b$ make ttc++ -O -pipe -march=pentiumpro tt.cpp -o tt-bash-2.05b$ ./ttPlease input your name:Heroyou are not wende!Hero , Welcome to China!How are you? Hero , Welcome to China!有了这些操作符,在STL中仿函数都可以直接使用string作为参数,例如 less, great, equal_to 等,因此在把string作为参数传递的时候,它的使用和int 或者float等已经没有什么区别了。
C语言字符串替换:字符,字符串,字符数组详解
C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。
本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。
⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。
(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。
"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。
c语言 string类型
c语言 string类型string类型是C语言中一种非常重要的数据类型,用于表示字符串。
字符串是指由一连串字符所组成的序列,是C语言编程中非常常见的数据类型。
本文将以“C语言 string类型”为主题,分步骤阐述相关概念和应用。
一、什么是string类型?string类型是C语言中预定义的数据类型之一,用于表示由一定数量的字符所组成的字符串。
它是通过在字符数组末尾追加一个空字符来实现的,因此也称为“以空字符结尾的字符数组”(null-terminated character array)。
二、常见操作1.声明string类型变量声明string类型变量的方式与声明其他数据类型的变量的方式相同,可以通过指定变量名和数据类型来实现。
例如:char str[20];2.初始化string类型变量初始化string类型变量可以通过赋值操作实现,即将一个字符串常量赋值给该变量。
例如:char str[20] = "Hello";3.向string类型变量中添加新的字符向string类型变量中添加新的字符可以通过在指定位置上插入该字符来实现。
例如:str[5] = 'W';4.连接两个string类型变量连接两个string类型变量可以使用C标准库中的strcat函数实现。
例如:char str1[20] = "Hello";char str2[20] = "World";strcat(str1, str2);5.字符串比较C语言中提供了strcmp函数用于比较两个字符串是否相等。
例如:if (strcmp(str1, str2) == 0) {printf("The two strings are equal.\n");} else {printf("The two strings are not equal.\n");}三、常见问题1. string类型变量的长度有何限制?由于每个字符占用一个字节的存储空间,因此string类型变量的长度最多只能为65535个字符。
C#中string.format用法详解
C#中string.format⽤法详解String.Format ⽅法的⼏种定义:String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的⽂本等效项。
String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的⽂本等效项。
String.Format (IFormatProvider, String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的⽂本等效项。
指定的参数提供区域性特定的格式设置信息。
String.Format (String, Object, Object) 将指定的 String 中的格式项替换为两个指定的 Object 实例的值的⽂本等效项。
String.Format (String, Object, Object, Object) 将指定的 String 中的格式项替换为三个指定的 Object 实例的值的⽂本等效项。
常⽤的格式化数值结果表字符说明⽰例输出C货币string.Format("{0:C3}", 2)$2.000D⼗进制string.Format("{0:D3}", 2)002E科学计数法 1.20E+001 1.20E+001G常规string.Format("{0:G}", 2)2N⽤分号隔开的数字string.Format("{0:N}", 250000)250,000.00X⼗六进制string.Format("{0:X000}", 12)Cstring.Format("{0:000.000}", 12.2)012.200常⽤的⼏种实例1、字符串的数字格式代码如下:string str1 =string.Format("{0:N1}",56789); //result: 56,789.0string str2 =string.Format("{0:N2}",56789); //result: 56,789.00string str3 =string.Format("{0:N3}",56789); //result: 56,789.000string str8 =string.Format("{0:F1}",56789); //result: 56789.0string str9 =string.Format("{0:F2}",56789); //result: 56789.00string str11 =(56789 / 100.0).ToString("#.##"); //result: 567.89string str12 =(56789 / 100).ToString("#.##"); //result: 567string str = string.Format("{0:f2}", .2); //result: 0.202、格式化货币(跟系统的环境有关,中⽂系统默认格式化⼈民币,英⽂系统格式化美元)代码如下:string.Format("{0:C}",0.2)结果为:¥0.20 (英⽂操作系统结果:$0.20)默认格式化⼩数点后⾯保留两位⼩数,如果需要保留⼀位或者更多,可以指定位数代码如下:string.Format("{0:C1}",23.15)结果为:¥23.2 (截取会⾃动四舍五⼊)格式化多个Object实例代码如下:string.Format("市场价:{0:C},优惠价{1:C}",23.15,19.82)3、格式化⼗进制的数字(格式化成固定的位数,位数不能少于未格式化前,只⽀持整形)代码如下:string.Format("{0:D3}",23) //结果为:023string.Format("{0:D2}",1223) //结果为:1223,(精度说明符指⽰结果字符串中所需的最少数字个数。
VC++ CString详解
1、CString 对象的连接:用”+”2、格式化字符串:用CString 对象的Format()方法。
用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧。
*****CString s; s.Format(_T("%d"), total);我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识#define _T(x) x // 非Unicode版本(non-Unicode version)而在Unicode环境下是如下定义的:#define _T(x) L##x // Unicode版本(Unicode version)所以在Unicode环境下,它的效果就相当于:s.Format(L"%d", total);如果你认为你的程序可能在Unicode的环境下运行,那么开始在意用Unicode 编码。
比如说,不要用sizeof() 操作符来获得字符串的长度,因为在Unicode环境下就会有2倍的误差。
我们可以用一些方法来隐藏Unicode的一些细节,比如在我需要获得字符长度的时候,我会用一个叫做DIM的宏,这个宏是在我的dim.h文件中定义的,我会在我写的所有程序中都包含这个文件:#define DIM(x) ( sizeof((x)) / sizeof((x)[0]) )这个宏不仅可以用来解决Unicode的字符串长度的问题,也可以用在编译时定义的表格上,它可以获得表格的项数,如下:class Whatever { ... };Whatever data[] = {{ ... },...{ ... },};for(int i = 0; i < DIM(data); i++) // 扫描表格寻找匹配项。
C语言字符串的输入输出
C语言字符串的输入输出C语言字符串的输入输出C语言适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。
那么大家知道C语言字符串的输入输出是怎样的呢?下面一起来看看!字符串的输出在C语言中,输出字符串的函数有两个:puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。
除了字符串,printf() 还能输出其他类型的数据。
这两个函数前面已经讲过了,这里不妨再演示一下,请看下面的代码:#includeint main(){ int i; char str[] = ""; printf("%s ", str); //通过变量输出printf("%s ", ""); //直接输出puts(str); //通过变量输出puts(""); //直接输出 return 0;}运行结果:在printf() 函数中使用%s输出字符串时,在变量列表中给出数组名即可,不能写为printf("%s", str[]);。
字符串的输入在C语言中,输入字符串的函数有两个:scanf():通过格式控制符%s 输入字符串。
除了字符串,scanf() 还能输入其他类型的数据。
gets():直接输入字符串,并且只能输入字符串。
1) 使用 scanf() 读取字符串请先看下面的例子:#includeint main(){ char str1[30], str2[30]; printf("Input str1: "); scanf("%s", str1); printf("Input str2: "); scanf("%s", str2); printf("str1: %s str2: %s ", str1, str2); return 0;}运行结果:Input str1: c.bi ↙Input str2: Java Python C-Sharp↙str1: str2: Java由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志``。
C语言-字符串函数大全和详解
c语言字符串函数详解void *memset(void *dest, int c, size_t count);将dest前面count个字符置为字符c.返回dest的值.void *memmove(void *dest, const void *src, size_t count);从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理.返回dest的值.void *memcpy(void *dest, const void *src, size_t count);从src复制count字节的字符到dest. 与memmove功能一样, 只是不能处理src和dest出现重叠.返回dest的值.void *memchr(const void *buf, int c, size_t count);在buf前面count字节中查找首次出现字符c的位置. 找到了字符c或者已经搜寻了count 个字节, 查找即停止.操作成功则返回buf中首次出现c的位置指针, 否则返回NULL.void *_memccpy(void *dest, const void *src, int c, size_t count);从src复制0个或多个字节的字符到dest. 当字符c被复制或者count个字符被复制时, 复制停止.如果字符c被复制, 函数返回这个字符后面紧挨一个字符位置的指针. 否则返回NULL.int memcmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节大小.返回值< 0, 表示buf1小于buf2;返回值为0, 表示buf1等于buf2;返回值> 0, 表示buf1大于buf2.int memicmp(const void *buf1, const void *buf2, size_t count);比较buf1和buf2前面count个字节. 与memcmp不同的是, 它不区分大小写. 返回值同上.size_t strlen(const char *string);获取字符串长度, 字符串结束符NULL不计算在内.没有返回值指示操作错误.char *strrev(char *string);将字符串string中的字符顺序颠倒过来. NULL结束符位置不变.返回调整后的字符串的指针.char *_strupr(char *string);将string中所有小写字母替换成相应的大写字母, 其它字符保持不变.返回调整后的字符串的指针.char *_strlwr(char *string);将string中所有大写字母替换成相应的小写字母, 其它字符保持不变.返回调整后的字符串的指针.char *strchr(const char *string, int c);查找字符c在字符串string中首次出现的位置, NULL结束符也包含在查找中.返回一个指针, 指向字符c在字符串string中首次出现的位置, 如果没有找到, 则返回NULL. char *strrchr(const char *string, int c);查找字符c在字符串string中最后一次出现的位置, 也就是对string进行反序搜索, 包含NULL结束符.返回一个指针, 指向字符c在字符串string中最后一次出现的位置, 如果没有找到, 则返回NULL.char *strstr(const char *string, const char *strSearch);在字符串string中查找strSearch子串.返回子串strSearch在string中首次出现位置的指针. 如果没有找到子串strSearch, 则返回NULL. 如果子串strSearch为空串, 函数返回string值.char *strdup(const char *strSource);函数运行中会自己调用malloc函数为复制strSource字符串分配存储空间, 然后再将strSource复制到分配到的空间中. 注意要及时释放这个分配的空间.返回一个指针, 指向为复制字符串分配的空间; 如果分配空间失败, 则返回NULL值.char *strcat(char *strDestination, const char *strSource);将源串strSource添加到目标串strDestination后面, 并在得到的新串后面加上NULL结束符. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 在字符串的复制或添加过程中没有溢出检查, 所以要保证目标串空间足够大. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncat(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符添加到目标串strDest后. 源串strSource的字符会覆盖目标串strDestination后面的结束符NULL. 如果count大于源串长度, 则会用源串的长度值替换count值. 得到的新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strcpy(char *strDestination, const char *strSource);复制源串strSource到目标串strDestination所指定的位置, 包含NULL结束符. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strncpy(char *strDestination, const char *strSource, size_t count);将源串strSource开始的count个字符复制到目标串strDestination所指定的位置. 如果count 值小于或等于strSource串的长度, 不会自动添加NULL结束符目标串中, 而count大于strSource串的长度时, 则将strSource用NULL结束符填充补齐count个字符, 复制到目标串中. 不能处理源串与目标串重叠的情况.函数返回strDestination值.char *strset(char *string, int c);将string串的所有字符设置为字符c, 遇到NULL结束符停止.函数返回内容调整后的string指针.char *strnset(char *string, int c, size_t count);将string串开始count个字符设置为字符c, 如果count值大于string串的长度, 将用string 的长度替换count值.函数返回内容调整后的string指针.size_t strspn(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外) 在string串中首次出现的位置序号.返回一个整数值, 指定在string中全部由characters中的字符组成的子串的长度. 如果string 以一个不包含在strCharSet中的字符开头, 函数将返回0值.size_t strcspn(const char *string, const char *strCharSet);查找strCharSet串中任何一个字符在string串中首次出现的位置序号, 包含字符串结束符NULL.返回一个整数值, 指定在string中全部由非characters中的字符组成的子串的长度. 如果string以一个包含在strCharSet中的字符开头, 函数将返回0值.char *strspnp(const char *string, const char *strCharSet);查找任何一个不包含在strCharSet串中的字符(字符串结束符NULL除外) 在string串中首次出现的位置指针.返回一个指针, 指向非strCharSet中的字符在string中首次出现的位置.char *strpbrk(const char *string, const char *strCharSet);查找strCharSet串中任何一个字符在string串中首次出现的位置, 不包含字符串结束符NULL.返回一个指针, 指向strCharSet中任一字符在string中首次出现的位置. 如果两个字符串参数不含相同字符, 则返回NULL值.int strcmp(const char *string1, const char *string2);比较字符串string1和string2大小.返回值< 0, 表示string1小于string2;返回值为0, 表示string1等于string2;返回值> 0, 表示string1大于string2.int stricmp(const char *string1, const char *string2);比较字符串string1和string2大小,和strcmp不同, 比较的是它们的小写字母版本.返回值与strcmp相同.int strcmpi(const char *string1, const char *string2);等价于stricmp函数, 只是提供一个向后兼容的版本.int strncmp(const char *string1, const char *string2, size_t count);比较字符串string1和string2大小,只比较前面count个字符. 比较过程中, 任何一个字符串的长度小于count, 则count将被较短的字符串的长度取代. 此时如果两串前面的字符都相等, 则较短的串要小.返回值< 0, 表示string1的子串小于string2的子串;返回值为0, 表示string1的子串等于string2的子串;返回值> 0, 表示string1的子串大于string2的子串.int strnicmp(const char *string1, const char *string2, size_t count);比较字符串string1和string2大小,只比较前面count个字符. 与strncmp不同的是, 比较的是它们的小写字母版本.返回值与strncmp相同.char *strtok(char *strToken, const char *strDelimit);在strToken 串中查找下一个标记, strDelimit字符集则指定了在当前查找调用中可能遇到的分界符.返回一个指针, 指向在strToken中找到的下一个标记. 如果找不到标记, 就返回NULL值. 每次调用都会修改strToken内容, 用NULL字符替换遇到的每个分界符.本文来自CSDN博客,转载请标明出处:/wully_happy/archive/2008/03/25/2216575.aspx。
