一、字符串的结束标志

1、很多时候我们都是可以看到相关的内容就是:

使用数组来存储字符串,也就是我们经常会使用到sizeof()和这个函数,而,这个函数只是求出当前该数组的最大容量,而不是数组中实际存放的内容,我们一般都是需要使用'\0'来表示字符串的而结尾,并且没有影响到相应的数组的操作的其他的内容,而是在系统外部自动添加的。这就是操作系统的问题,所以我们是可以使用'\0'来判断字符串的结束。
(所以我们使用while来循环对字符串的输出等,字符串的长度就不那么的重要了)
'\0'一个空的操作符,并且ascii码是0,也就是不会显示,并且也没有什么操作;即为:不会增加附加的操作或者增加有效的字符。只是起到一个辨别的标志。

2、字符串中的常量
eg:printf("how do you do ?\n");
想过没有,系统是怎么知道字符串到哪里结束???可能我们都是很理所当然的就是系统告诉了我们。
actually:内存中存放时候,系统会自动在'\n'后面增加一个'\0'作为字符串的结束标志。
printf执行的原理是: 每执行一个字符之前都会检查一下这个字符是否为'\0',如果遇到'\0'就会停止输出。

字符串的初始化:
类似我们一般的数据来进行初始化:
方式1)char c[]={'I',' ',a','m',' ',h','a','p','p','y','\0'};//就是逐个对应赋值

通过对字符串的常量的了解:
通过字符串的方式进行赋值;
方式2)char c[]={"I am happy"};

方式1)的字符串的长度是11,方式2)的字符串的长度是10

所以:若是,
char c[10] = {"china"};
前五个是元素,第六个是'\0',后面的4个也设定了空字符。

说明:字符串并不要求最后一个字符为'\0',甚至可以不包含'\0'。是否需要'\0',系统会自动增加。

为了方法处理的一直性,常常认为的增加了一个'\0'在数据的后面。
eg:char c[6]={'c','h','i','n','a','\0'};
这样处理便于引用字符数组中的字符串。

总结:
不管是数组的方式一个个对应的对号赋值,还是通过字符串常量的方式赋值,我们都应该使用统一的范式。
也就是数组的方式我们应该赋值一个'\0'作为结束标志,而字符串常量系统会自动增加。

二、字符数组的输入和输出
两种方法:
1、逐个字符输入输出,格式符是"%c",循环输出。
2、将整个字符串一起输出。格式符是"%s",表示输出的是字符串
char c[] = {"china"};
prinft("%s",c);
输出时,遇到'%c'就停止输出。输出结果是china
注意事项:
1)输出字符不包含'\0',因为这个是操作系统和语言的问题,不是数据本身的问题。
2)"%s" 在函数中的输出项是字符数组名。
3)若是数组的长度大于字符串的实际长度,还是遇到'\0'就停止输出。
char c[10]={"china"}; 同样是输出:china 而不是输出10个字符
4)如果数组中有大于1个'\0'的符号的,遇到第一个'\0'的时候就会停止输出。
5)可以使用scanf("%s",c);输入一个字符串

char str1[5],str2[5],str3[5];
scanf("%s,%s,%s",str1,str2,str3);
输入数据:
How are you?
元素存放的情况:
How\0\0 
are\0\0 
you?\0
即为输入的时候,空格表示输入结束。

如果改为;
char str[13];
scanf("%s",str);
键盘输入:
How are you?
输出的将会是:
How
原理:
How\0\0……(后面的都是\0)
原因:因为系统将空格符号作为输入字符串之间的分隔符。

三、字符串的处理函数
1、puts(字符数组)
作用:将一个字符串(以'\0'结束的字符系列)输出到终端。
eg:
char str[]={"china \n Bei jing"};
puts(str);

char str[]={"china \nBei Jing"};
    printf("%s",str); //这个末尾没有自动换行
    puts(str);  //这个末尾是自动换行
由于字符串的输出常常会用到printf()函数,所以puts()函数使用得很少。

2、gets(字符数组)
作用:从终端输入一个字符串到字符数组,并且得到一个函数值。
该函数值是字符数组的起始地址。
eg:
gets(str)

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str[100];
    char *p;
   p = gets(str);
   //在终端中输出字符串“hello”,即为将hello字符串发送给数组str,
   //且注意送个字符数组的个数是6而不是5,
    //因为还有一个\0 结束标识符

puts(p); //输出字符串,并且自动换行
    printf("%s\n",p); //输出字符串
    printf("%p\n",p); //输出首地址
//(一般的:gets()函数的目的是向字符数组输入一个字符串,二不大关心其函数值)
    return 0;
}

注意事项:
puts()
gets()
只是能够输出或者输入一个字符串,不能够输入、输出多个字符串。
下面是错误的格式:
gets(str1,str2);
puts(str1,str2);

3、strcat(字符数组1,字符数组2) 全称(string catenate字符连接) 
将字符数组2中的字符串链接到字符数组1的末尾,返回的函数值是字符1的首地址,
也就是将结果存放在字符数组1中。
eg:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str1[40] = {"I am student "};
    char str2[] = {"You are very good"};
    printf("%s",strcat(str1,str2));
    return 0;
}
//输出的结果将会是:I am student You are very good

注意事项:
1、就是数组1应该足够大,以便于容纳后面加入的字符串。
如果上面将str1修改为:char str1[]={"……"},即为没有提供足够的控件,加入数据之后,就会显示错误。
2、两个字符串的后面都有一个'\0'字符,连接了以后,str1中的那会没有,之后链接之后最后面的一个'\0'字符。

4、strcpy 、strncpy 函数
(string copy)字符串赋值 (string number copy)
strcpy(字符数组1,字符串2)
作用:是将字符串2复制到字符数组1中。
eg:
char str1[10]='',str2[]={"china"};
说明;
1)字符数组1必须定义足够大容纳字符串2
2)字符数组1必须写成数组名形式,“字符串2”可以是字符数组名,也可以是字符串常量。
eg:strcpy(str1,"china");
3)如果在赋值前没有对str1数组赋值,则str1的内容将会不可知的。复制的时候将str2中的字符串和其后面的'\0'一起复制到字符数组1中的,也就是复制了6个字符,而后面的4个字符还是保持着原来的内容。
4)不能够将一个字符串常量或字符数组直接给一个字符数组。
eg:下面的不合法的表示方法:
str1 = "china";
str1 = str2;
原因:
赋值符号"=",赋值语句只能够将一个“字符”赋值给一个“字符变量”;
而字符串只能够使用strcpy函数将一个字符串赋值到另外一个字符数组中。
&&也就是c语言中字符串赋值只能够使用strcpy等等拷贝函数。
5)strncpy 函数将字符串2中前面n个字符复制到字符数组1中
如下:
strncpy(str1,str2,2);

5、strcmp函数
strcmp(字符串1,字符串2) 全称:string campare 字符串比较
比较字符串1 和字符串2
字符串比较规则:
两个字符串自左到右逐个字符相比(安照ASCII码值比较大小),知道字符不同或者'\0'的时候截止,判断出大小。
str1>str2 ,函数值是正数
str1=str2 ,函数值是 0 
str1<str2 ,函数值是负数

6、strlen(字符数组) 全称:string length (字符串的长度)
函数的值是字符串的实际长度,不包含'\0'在内。
即使我们在用数组定义的时候有'\0'在内,只不过只是为了统一处理而增加的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> \\c中的标准库寒素
int main()
{
  char str3[]={'d','2','\0'};
  char str4[]={'d','2'};

printf("%d \n",strlen(str3));

printf("%d \n",strlen(str4));
    printf("%d  \n",strcmp(str3,str4));

printf("%s \n",str3);
    printf("%s \n",str4);
    return 0;
}
//1、注意c语言标准库中有string.h 的头文件,但是么有string这个类的说法,
//2、c语言中中的string.h头文件存放着的是strcpy等等函数
//3、string是一个普通名词,也就是字符串的意思,在c语言总就是存放着一些对char类型数据的操作,
//在上面的(2)已经讲过,知道c++中有string类,才可以定义相应的对象。
//4 、strlen计算出来的就是字符串中的有效长度,

//5 、上面的程序的运算结果是:

为什么会出现这个问题呢?

因为我们在直接通过字符数组初始化的时候,没有自动在末尾添加'\0',在内存中还是自动存放在内存上,所以没有'\0'很好的作为结束符,所以会出现上面的错误,

如果我们使用功能scanf()以及gets()函数的时候,编译器会自动添加'\0'。

如果使用字符常量来表示的话,上面已经讲到了,都会自动添加'\0'的,所以特殊的就是字符数组了。

同时,上面提到字符字符数组中的末尾加上'\0'和没有'\0'其实没有太大的变化。长度都是相等。可能不同版本会是不一样的。

7、strlwr(字符串) 全称;string lowercase 字符串小写
//将字符串中的字符都编程小写

8、strupr(字符串) 全称:string uppercase
//将字符串中的字符都编程大写

c语言中的字符数组和字符串之间的关系相关推荐

  1. android 数组赋值字符串_c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  2. c语言数组和字符串编程题,C语言中的字符数组和字符串详解

    c语言字符数组和字符串: 1.存放字符的数组称为字符数组 char str[] 2.'\0'也被称为字符串结束标志 3.由" "包围的字符串会自动在末尾添加'\0' 4.逐个字符地 ...

  3. C语言中关于字符数组输入,scanf没执行

    问题:有时C语言中关于字符数组输入,有的scanf语句没执行. 未执行scanf的代码: #include<stdio.h> int main() {int n;int t=0;scanf ...

  4. C#字节数组和字符数组与字符串之间的转换

    1.marshal类,提供了一些方法集合,如分配非托管内存,拷贝非托管内存,转换托管和非托管类型,以及一些和非托管代码交互的杂类方法 //分配非托管内存 IntPtr hglobal = Marsha ...

  5. C语言中的字符函数和字符串函数

    目录 前言 1.常用函数介绍 1.1 strlen 1.2 stycpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 s ...

  6. 程序设计与C语言引论笔记——字符数组与字符串

    字符数组与字符串 字符串字面量 C语言规定了字符串字面量的描述方式:用一对双引号括起的任意字符序列就是一个字面量的字符串. 这里唯一的限制是一个字符串不能跨越两行.如果顺序写出多个字符串,他们之间仅由 ...

  7. 【小白学习C++ 教程】十七、C++ 中的字符数组和字符串常见的函数

    @Author:Runsen 字符数组 char mychar[6] = {'H', 'e', 'l', 'l', 'o'}; 下面定义的字符串数组在 C/C++ 中的内存表示 #include &l ...

  8. php和c语言的字符数组中,字符数组和字符串的区别,C语言字符数组和字符串区别详解...

    C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串.那么,字符数组就一定是字符串吗? 对于这个问题,大多教科书中的回答是"是".其实不然,字符数组和字符串是完全不相 ...

  9. 关于C语言中字符数组和字符串的输出

    本文内容仅仅代表个人在学习中遇到的问题并作出的总结,如有错误的地方和别的想法可以联系一起学习讨论! 文章目录 前言 一.字符数组和字符串 二.过程分析 1.字符数组和字符串输出对比 2.字符数组和字符 ...

  10. C语言字符数组与字符串的使用及加结束符‘\0‘的问题

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

最新文章

  1. leetcode345——Reverse Vowels of a String(C++)
  2. meeting with nate mar 13 meeting notes
  3. C#调用WebService实例和开发(转)
  4. linux和windows下忘记mysql密码的几种找回方法
  5. [HNOI 2010]Planar
  6. 一边学,一边写出的人工智能教程(一)
  7. 第 4 章 设计模式概述
  8. Atitit 提升团队开发效率项目进度的一些大的流程方向attilax总结
  9. xsemaphoretake返回_FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用
  10. cd40系列芯片_CD40系列芯片大全
  11. qt实现视频播放器,基本功能都有,可以当毕设用
  12. Redis、ES、Nginx和RabbitMQ面试回忆
  13. 「程序员值得一看」| 传说中的“全球公认最健康的作息时间表”
  14. 基于BIM轻量化的智能建造OA管理系统
  15. BUUCTF:[UTCTF2020]sstv
  16. 启动远程计算机的屏保,远程桌面能使用屏幕保护吗
  17. 设计神经网络的基本原则,神经网络设计与实现
  18. 学Java的第十八天
  19. 企业微信修改导航栏颜色api
  20. Valens VS2311GF HDBaseT光纤接口

热门文章

  1. undo歌词中文音译_undo的中文谐音歌词
  2. 博客营销为何这么神奇而不被淘汰的
  3. unity物理引擎详解
  4. 计算机学院实习报告3000字(Java开发实习)--持续更新中,多个专业,以及版本
  5. Spring5学习笔记——【遇见狂神说】[IoC、DI、AOP]
  6. 流体力学有限元法(二)
  7. MATLAB的非线性变换
  8. kali工具 -- setoolkit(克隆网站及利用)
  9. word文档计算机基础考试,计算机基础考试题库(含答案)48924
  10. ipad mini2降级刷10.3.3系统教程