C字符串

C字符串

  C中的字符串是以空字符(‘\0‘)结尾的一个char数组,基本的实现字符串的方法有:字符串常量,字符串数组,char数组,char指针。字符串使用广泛,如与用户交互等处理自然语言的情况。C为其提供的许多函数主要包含在string.h(各种处理函数)和stdio.h(面向字符串的输入输出函数)。

一、字符串的实现

1.字符串常量

  字符串常量(又称字符串文字),是指位于一对双引号中的任何字符,编译器会自动在其结尾添加‘\0‘作为结束标志。字符串常量属于静态存储类,即使多次调用这个常量它在内存中也只存储一份(当然,再用字符串常量初始化char数组时它被复制了,这时副本已经不是字符串常量了)。字符串常量做参数时形参通常声明为const char *。

2.char数组与char指针

(1)在使用char数组时需要有足够大的空间来存储字符串。在对char数组进行初始化的情况下可以不指定长度而由编译器决定(最小长度,字符数加一个‘\0‘)。

(2)char数组初始化有两种方式,可以用一个字符串常量,也可以像数值数组一样用花括号包含初始化表列,未被初始化的元素被自动置为‘\0‘【char [] = “example”;】。

(3)在使用初始化表列且未指定数组长度时,一定要在结尾加上‘\0‘,否则这只是一个字符数组而非字符串。和其它数组一样char数组是一个指向一段连续空间首地址的指针常量。

(4)char指针指向一个字符串的首地址(通常是字符串常量也可以是一个char数组)。对char数组赋值必须逐个元素赋值,对char指针赋值只需要复制地址即可。

 

//例

char *ch;//声明一个指针ch

ch = (char *)malloc(sizeof(char));//ch指向一个char类型的数组

(5)char指针可以进行加减,自增(减),取值运算也可以像数组一样进行变址运算(s[])。而char数组不允许修改。数组与指针在内存模型上有更多区别。比如:

 

char arr[M];

 char *ptr = (char *)malloc(sizeof(char));

 printf("%d %d\n", sizeof(arr),sizeof(ptr) );

(6)char指针指向的字符串在内存中只存储了一份,一旦修改所有引用处均被修改,而且char指针难以指定空间大小(必须用malloc)。

char指针初始化后,尽量不要修改其内容(包括用来接受输入),或者使用const来保护其内容。因为char指针指向空间有限,一般只作为字符串常量使用。

3.字符串数组

  (1)批量处理字符串可以使用字符串数组,可以使用二维char数组(char s[][])或指针数组(char*s[])。其异同与数值型二维数组和指针数组相同。

  (2)由于二维数组的第二维长度必须保证大于最长的字符串,指针数组每个字符串只需要最小长度,所以指针数组的存储密度较高。同样由于初始化困难,指针数组通常作为常量使用。

二、字符串操作函数

字符串的输入输出请参见I/O一文。除特殊说明外,下列函数均需包含string.h。

1.字符串长度:

  size_t strlen(const char*);

  返回字符串第一个‘\0‘前的字符数(不包含‘\0‘),即字符串的有效长度。

2.字符串复制(string copy):

  char* strcpy(char*dest,const char*sco);

将参数2(source)中字符串复制到参数1(destination)中,返回指向参数1的指针。需要程序员保证串1足够大。

  char*strncpy(char*dest,const char sco,size_t n);

将前n个字符进行复制。

void*memcpy(void*dest,const void*sco,size_t size);

将sro指向的内存内容复制到dest,由size参数指定长度。需包含string.h或memory.h。memcpy可以复制任何内容,strcpy只能复制字符串。

3.字符串比较(string compare):

   int strcmp(const char*,const char*);

   比较字符串相同返回0,不同返回第一个不同字符ASCII码之差。大小写不敏感,常与逻辑非(!)结合表示字符串相同。

   int stricmp(const char*,const char*);

  以大小写不敏感的方式复制字符串。

4.字符串连接(string catch):

  char*strcat(char*dest,const char*src);

   将src字符串接在dest后面(自动移动‘\0‘),返回dest指针。需程序员保证dest足够长。

  char*strncat(char*dest,char*sco,size_t n);

  将sco的前n个字符连接在dest上。

5.查找子串(string string):

   char*strstr(const char*text,const char*model);

   在正文(test)中查找模式子串(model),返回从指向第一个匹配点的char指针。可以使用

   strlen(test)-strlen(strstr(test,model))来求得匹配点的下标。

6.查找字符(string character):

   char* strchr(char*test,char c);

   在test中查找字符c,返回指向c的指针,可以利用长度相减确定下标。也可以用来查找字符串中是否有给定字符集中的字符(或给定字符集中没有的字符)。

    

for( int i = 0; i < strlen(test); i++) {

  if(strchr(lib,test[i])) {

     //…

  }

}

在字符集(lib)中查找test中的每一个字符,判断test中的哪一个(或全部)字符是否在(或不在)字符集内。在test中查找lib中的每一个字符通过返回值判断test中有lib里的哪个字符。

7.向字符串格式化输出(string print format):

   int sprintf(char*buf,const char*format,…);

  用法类似printf,但是向字符串buf输出并返回buf的长度(同strlen),多次向同一字符串输出将覆盖原有内容。需包含stdio.h。

  可以用来将数字逐位打印到数组中,对每一位进行处理。但要注意字符串中的是数字字符而不是数字,不要忘记-‘0‘【9=”9”-”0”】。

8.从字符串格式化输入(string scan format):

   int sscanf(char*buf,const char*format,…);

     用法类似scanf,但是从buf中读取。成功返回参数数目,失败返回-1。需包含stdio.h

   可以用来将字符串转换成数值或者进行匹配输入("x=%lf",从中读取数值)。

sprintf与sscanf函数常用来实现字符串与其它数据类型的转换。

时间: 2024-08-01 10:26:54

C字符串的相关文章

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

PHP 格式化字符串sprintf()

字符串函数 sprintf() 函数把格式化的字符串写入一个变量中 函数说明:sprintf(格式, 要转换的字符串)  参考PHP手册 返回: 格式化后的字符串 举例: 如:保留2位小数, $str = '99.9';echo sprintf('%01.2f', $str);结果为:99.90 echo round($str, 2); 结果为:99.9

js中字符串的替换

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

SpringMVC后台使用对象接受参数字符串转日期

在springMVC配置文件中加入: <bean id="dateConvert" class="com.iomp.util.DateConvert"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

【自动化__持续集成】___java___字符串转数组

一.代码如下 package www.wujianbotwo; public class Demo08 { public static void main(String[] args) { // TODO Auto-generated method stub String content= "wujianbo,wujianob,33333"; String[] ud= content.split(",");//将字符串分段成一个数组 for(int i=0; i&l

字符串的模式匹配中的算法

字符串的模式匹配是一个比较经典的问题:假设有一个字符串S,称其为主串,然后还有一个字符串T,称其为子串. 现在要做的是,从主串S当中查找子串T的位置,如果存在返回位置值,如果不存在返回-1.另外主串又称为目标串, 子串称为模式串. 暴力匹配算法 这是一个经典的串匹配问题,涉及的算法也比较多,先讨论第一种简单的暴力算法,思路如下 将主串S的第pos个字符 与 子串T的第一个字符比较, 若相同,继续比较子串和主串后面的字符. 若不相同,那么从主串S的第(pos + 1)个字符开始继续向后匹配,直到匹