C语言中的字符串
字符串
- 字符串
用双引号引起来的多个字符。
在C语言中字符串是用’\0’结束的。即每个字符串的最后一个字符是’\0’,但是结束符不显示,仅仅标志该字符串到这儿就结束了。
二、声明字符串
char *str = “Hello world!\n”;
系统在常量区分配一块存储空间,存储形式是:
把该字符串在常量区的地址保存到指针变量str中。
可以以%s的形式在屏幕上打印输出字符串,如:
printf(“%s”, str );
需要注意的是:1) str是一个指针变量,该变量在栈结构中,而实际的字符串在内存的常量区。2)该字符串在内存常量区中占用14个字节,因为有一个结束符’\0’。3)在printf()函数中以%s打印输出时,从指针变量str标识的地址开始打印,直到遇到’\0’。4)字符串是一个常量,不能被修改,即 *str = ‘W’; 通过指针变量给这个字符串的第一个字符重新赋值是不正确的。5)声明字符串会返回该字符串在常量区的地址,所以:printf( “%c\n”, ”hello world!\n”);这条语句在执行时,会打印输出字母h。因为取操作后就是这个地址所指向的字符。
三、字符串的常用操作
1. 字符串的修改。
因为字符串在常量区,不能被修改,如果需要修改字符串,需要把字符串复制到栈结构中的数组中,再修改:
char str2[] = “hello world\n”;
字符数组可以直接按以上形式直接初始化。再次提醒大家,sizeof(str2) 应该返回的值是14,因为需要包括结束标志’\0’.
2.字符串的读取与打印
先定义一个足够大的数组,然后通过scanf()函数以%s的格式输入,如:
char buff[64]; //定义存储字符串的数组
scanf( “%s”, buff ); //读取
printf(“%s\n”, buff ); //打印
这儿需要说明的是scanf("%s")这种格式在接收字符串时,它不能接收空格、tab键等空白字符,如果需要接收这些空白字符,需要使用gets(str)函数, 用这个函数会弹出不安全警告,因为输入的内容可能会超过数组的长度
需要注意:
char * str;
scanf(" %s" , str ); //??????是否可以读一个字符串,str只是定义了没有初始化,指向哪儿不确定,这就是野指针
3. 通过指针变量保存字符串
char *p1 = "abcdef";
char *p2 = "abcdef";
"abcdef"字符串保存在常量区中,不能被修改,即
*p1 = 'h'; 会出错; 另外,p1变量中保存的地址和p2变量中保存的地址是相同的。都是"abcdef"字符串的首地址。
练习:
char * demo(){
char names[] = "zhangsan";
return names;
}
通过这种方式返回在子函数中定义的局部变量数组names,实际返回的是空。应该把char names[]数组改为指针的形式:
char *names = "zhangsan"; //保存在常量区
四、 字符串的相关函数
字符串的相关函数的声明在头文件string.h中
1. 字符串的复制
strcpy ( char * dest, const char *source);
dest是一个数组的首地址, source是一个字符串常量的首地址,把source复制到数组dest中,包括最后的结束标志也要复制,该函数返回dest.
字符串在复制时,实际上是
int i = 0;
for ( ; source[i] != '\0'; i++ ){
dest[i] = source[i];
}
dest[i]='\0';
或写为:
char * x = dest;
while( *dest++ = *sourse++) ;
return x;
2. 字符串的长度
size_t strlen ( const char *)
计算字符串的有效长度,不包括结束标志
size_t是 unsigned long的别名
3. 字符串转数字
int atoi ( const char *s); //该函数在stdlib.h头文件中
将数字字符串转换为数字,如将“123”转换为123.
4.字符串连接
char * strcat( char * s1, const chsr *s2)
将s2字符串拼接到s1字符串后面
练习:输入三个字符串,并将三个字符串拼接到一起,生成一个新的字符串;
5. 查找子串
char * strstr( const char *s1, const char *s2)
在s1中查找s2,返回首字母的地址,如果找不到,返回NULL。
练习:在一个字符串“adbcdeedededededead",中查找子串“ded"出现的次数。
6. 字符串比较
char * strcmp( const char * s1, const char * s2)
依次比较两个两个字符串的每个字符,返回首个不相等字符的Ascii码的差值。如果s1比s2大,返回正数,否则返回负数,相等返回0
7.字符串分隔函数
char* strtok( const char *s1, const str *s2);
被分隔的字符串s1,可能在数组中,不是是常量字符串。s2是分隔符
char str[] = "hello world You are good";
char *p = str;
while( 1 ){
p = strtok(p, " " ); // p=strtok(p, " ,.!" );
if (p == NULL)
break;
printf("%s\n", p );
p=NULL;
}
作业:
1.自己编写一个函数,实现两个字符串的连接
2.实现字符串的比较函数
3.实现字符串查找函数
4. 将字符串中的单词逆序输出,”you are a man",输出后“man a are you"。
5.输入一行字符串,清除该行字符串中的标点符号。
1. char * substr (char * dst, char *src, int start, int end)
从字符串src中取出从start到end的子串,通过dst和返回值返回子串指针,请实现。
2. char * remove( char *src, int start, int len)
从src的start处删除长度为len的字串,返回新串指针,请实现。
3. 输出 “abcdcabcdcefcdcdcg” 中 “cdc”出现的次数
cdccdc算作出现两次
cdcdc算作出现一次
C语言中的字符串的更多相关文章
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言中格式字符串
C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符 ...
- C语言中求字符串的长度
在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>) 因为C语言字符串是以 \0 结尾表示 ...
- C语言中以字符串形式输出枚举变量
C语言中以字符串形式输出枚举变量 摘自:https://blog.csdn.net/haifeilang/article/details/41079255 2014年11月13日 15:17:20 h ...
- R语言中的字符串处理函数
内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串有时候也会在数据分析中占到相当大的份量. R语言是一个擅长处理数据的语言,但是也不可避免的需要处理一些字符串(文本数据).如何高 ...
- Go语言中的字符串处理
1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号(“”)或反 ...
- 【R笔记】R语言中的字符串处理函数
内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串同样极为重要.从医疗研究数据里的出生日期到文本挖掘的应用,字符串数据在R程序中使用的频率非常高.R语言提供了很多字符串操作函数,本文仅简 ...
- 关于c语言中的字符串的问题
静态数组,动态数组,链表是c语言中处理存储数据最基本的三种方式. 1.静态数组,你先定好大小,直接赋值即可,不要超过定义的长度. 2.动态分配数组,在执行的时候,输入要分的内存大小,然后p=(vo ...
随机推荐
- 【Swift学习】Swift编程之旅---属性(十四)
属性关联特定类.结构或枚举的值,存储属性将存储常量和变量作为实例的一部分,计算属性用于计算一个值,而不进行存储.计算属性可以用于类.结构体和枚举里,存储属性只能用于类和结构体.存储属性和计算属性通常用 ...
- STM32L系列单片机内部EEPROM的读写
STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- 利用Abot爬虫和visjs 呈现漫威宇宙
1. 引言 最近接触Abot爬虫也有几天时间了,闲来无事打算从IMDB网站上爬取一些电影数据玩玩.正好美国队长3正在热映,打算爬取漫威近几年的电影并用vis这个JS库呈现下漫威宇宙的相关电影. Abo ...
- 基于TCP和多线程实现无线鼠标键盘-Socket(2)
在(1)中,实现了Windows服务端与Android客户端的连接,本节将实现在Windows服务端与Android客户端之间传递数据. Android客户端的发送线程SendThread.java代 ...
- luogg_java学习_02_基本语法
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 关键字 定义:被java语言赋予了特殊含义,用作专门用 ...
- 2016暑假多校联合---GCD
Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). ...
- 框架Hibernate笔记系列 基础Session
标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...
- mysql安装中出现的问题,
花了一天的时间明天mysql的安装方法: 自己的错误: 主要原因: (1):bin文件坏境配置出现了问题,没有重新在系统中配置文件 解决方法:右击电脑——属性——高级系统设置——变量配置——在path ...
- 三层架构与MVC之间的区别
文章转发自:http://www.admin10000.com/document/535.html 我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真 ...