C语言没有一种显式的数据类型是字符串的。

C语言存储字符串:字符串常量(不能改动)。字符数组或动态分配的内存(能够改动)

****************************************************

9.1 字符串基础

字符串概念:字符串是以一个位模式为全0的NUL字节结尾的0个或多个字符

NUL字节是终止符,字符串的长度不包括NUL字节

头文件string.h包括了使用字符串函数所需的原型和声明(能够在linux中查看,有非常多函数声明)。

****************************************************

9.2 字符串长度

size_t是一个无符号整数类型。定义与stddef.h头文件

做算术运算的时候无符号整数可能导致不可预料的结果(想想,见9.2)

****************************************************

9.3 不受限制的字符串函数

——》复制字符串 strcpy函数:  char *strcpy( char *dst, char const *src);

Note:

1.复制字符串也会复制NUL字节;

2.假设dst目标字符数组空间不足以容纳须要复制的字符串。strcpy将侵占数组后面的部分内存空间(由于strcpy无法推断目标字符数组的长度,这也是”不受限制“的含义吧)

——》连接字符串 strcat函数:
char *strcat( char *dst, char const *src );

Note:

1.这个函数找到dst的末尾(NUL字节吗),把src字符串的一份拷贝加入到这个位置

2.这个函数也有strcpy的特点,假设dst空间不足以容纳须要复制的字符串了。则也将侵占数组后面的部分空间

——》字符串比較 strcmp:
int strcmp(char const *s1, char const *s2);

Note:

1.这个函数的结果符合“字典比較”

****************************************************

9.4 长度指定了限制的字符串函数

上面没有受限的函数是以寻找字符串结尾的NUL字节来推断长度。这里的函数指定进行复制或比較的字符数

——》strncpy函数:char *strncpy( char *dst, char const *src, size_t len );

Note:

1.把源字符串src的指定数目字符拷贝到目标数组dst;假设src没有len个字符,则会用NUL字节填充到dst

2.假设是strlen(src)大于len。那么仅仅有len个字符会进行复制。!可是,它的结果将不会以NUL字节结尾。

(也就是说,strncpy调用的结果可能不是一个字符串哦)

——》strncat函数:char *strncat( char *dst, char const *src, size_t len);

Note:

1.strncat在连接完后,会自己主动在结果后加上一个NUL(因此这还是比較安全的,不会由于没有NUL而在其它函数中出现故障),比例如以下程序

#include <string.h>
#include <stdio.h> int main()
{
char *src = "world";
char dst[7] = "hello";
strncat(dst, src, 5);
printf("%s", dst); return 0;
}

由于dst容量(7)不够装下helloworld(11),因此strncat会侵占几个dst后面的字节。可是在侵占完后。strncat还是会加上一个NUL字节。因此既有不安全的一面(侵占兴许字节)也有安全的一面(自己主动加NUL字节)

2.在src的长度不够len时,它不会用NUL字节继续填充dst

*************************下面是一些相关的辨析

#include <string.h>
#include <stdio.h> int main()
{ char *src = "world";
printf("length of src is %d\n", sizeof(src));
printf("length of src is %d\n", strlen(src)); char dst[7] = "hello";
int mat[100];
strncat(dst, src, 9);
printf("%s\n", dst); printf("length of dst is %d\n", sizeof(dst));
printf("length of src is %d\n", sizeof(src));
printf("length of src is %d\n", strlen(src));
printf("length of mat is %d\n", sizeof(mat)); return 0;
}

执行结果为

这说明了几点:

1.对于数组名来说,通常是作为指针。可是在sizeof(数组名)中,是求取了数组占用的“字节”数;

2.在strncat后,输出helloworld后。对dst数组求字节数却还是7. 说明数组长度是被记录下来的。不会变化了。可是往后仅仅要用%s格式输出dst,都会输出helloworld。由于在后面都增加了'\0';

3.全然不解!

为什么在開始strlen(src)还有5,可是在调用了strncat之后strlen(src)就仅仅有1了?求解答~

再看下面的程序

#include <string.h>
#include <stdio.h> int main()
{
//1
*src = "hello";
printf("length of src is %d\n", sizeof(src)); // 2
printf("length of 'hello' is %d\n", sizeof("hello")); // 3
char haha[] = "hello";
printf("length of haha is %d\n", sizeof(haha)); return 0;
}

执行结果为

这说明了下面几点:

1. 行1&2结合,我的分析是。在1中src在可重定位目标文件里是一个存在于符号表中的标识符,是一个指针变量,以常量字符串“hello”的起始地址初始化(执行时);而在2中“hello”是一个常量字符串。在执行前已经存放好,放在可重定位目标文件(编译汇编之后,链接之前产生的文件).rodata segment中(?不正确耶,用objdump查看了,行1中的“hello”确实存放在rodata段中,可是sizeof(“hello”)中的“hello”没有放在rodata中,由于若删去第1行,则rodata中没有hello了,例如以下图是删去了第1行两句话)

2.结合2&3分析,说明字符数组包括了'\0'

【C】字符串,字符和字节(C与指针第9章)的更多相关文章

  1. 字符串、字符、字节以及bit位小结与疑问

    字符串是由一个个字符组成的,每个字符又有一个或多个字节来表示,每个字节又由8个bit位来表示 在C#里 字符串通常由string来声明,字符由char来声明,字节由byte来表示,位由bit来表示,具 ...

  2. python第七天(字符编码,字符与字节,文件操作)

    一.字符编码: 定义:将人识别的字符转换成计算机能识别的0和1,转换的规则就是字符编码表. 常见编码表:ascii.unicode.GBK 编码表: 1.采用的都是unicode编码表 2.unico ...

  3. Python编程Day7——字符编码、字符与字节、文件操作

    一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...

  4. java中的字符,字节和编码

    1. 编码问题的由来,相关概念的理解 1.1 字符与编码的发展 从计算机对多国语言的支持角度看,大致可以分为三个阶段:   系统内码 说明 系统 阶段一 ASCII 计算机刚开始只支持英语,其它语言不 ...

  5. 数据结构之 字符串---字符串匹配(kmp算法)

    串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述   给定两个字符串string1和string2,判断string2是否为strin ...

  6. java String长度与varchar长度匹配理解(字符和字节长度理解)

    java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...

  7. 【VS开发】字符,字节和编码

    字符,字节和编码 [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/encoding.htm] 级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理 ...

  8. String截取字符串的指定字节长度

    /** TODO:截取字符串的指定字节长度 * @Author wenjing * @Date 11:02 2019/5/15 * @Param [str, bengin, end] * @retur ...

  9. JAVA关于字符串&&字符数组处理的小题目

    JAVA关于字符串&&字符数组的小题目 第二题:分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: ...

随机推荐

  1. 一条HTTP的生命之旅(高频面试问题)

    当你在浏览器地址栏输入一个URL后回车,将会发生的事情? 原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a- ...

  2. 如何安装多个pip包

    要在命令行上安装多个软件包,只需将它们作为以空格分隔的列表传递,例如: pip install wsgiref boto  

  3. 【讲●解】KMP算法

    KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...

  4. 关于Servlet一些东西

    ---- 概念 Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器 ...

  5. selenium 浏览器基础操作(Python)

    想要开始测试,首先要清楚测试什么浏览器.如何为浏览器安装驱动,前面已经聊过. 其次要清楚如何打开浏览器,这一点,在前面的代码中,也体现过,但是并未深究.下面就来聊一聊对浏览器操作的那些事儿. from ...

  6. 07 mongodb

    mongodb mongodb简介 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为Web应用提供可扩展的高性能数据存储解决方案.    MongoDB是一个介于关系数据 ...

  7. mysql启动问题

    /usr/local/mysql/bin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied) - ...

  8. Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)

    1. 何为Accessibility机制 许多Android使用者因为各种情况导致他们要以不同的方式与手机交互.对于那些由于视力.听力或其它身体原因导致不能方便使用Android智能手机的用户,And ...

  9. 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入

    导读:在做项目的时候,当实现了动态建库后,需要实现从本地服务器上获取数据,批量导入到新建库的服务器中的一个表中去.之前是用了一个SQL脚本文件实现,但那时候没能实现不同的数据库服务器,现在用了SqlB ...

  10. centos7安装rlwrap

    http://utopia.knoware.nl/~hlub/uck/rlwrap/ 下载rlwrap-0.42.tar.gz 找到centos7 安装的iso中的 Packages的 ncurses ...