目录

文章目录

  • 目录
  • 前文列表
  • 字符串
  • 字符串拷贝
  • 字符串比较
    • strcmp
    • strncmp

前文列表

《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》

字符串

在 C 语言中,字符串由 char * 类型表示。它是由一串字符组成的,并以一个空终结字符结尾。所以,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。下面的声明和初始化创建了一个 “Hello” 字符数组(字符串)。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

字符串还可以字面量来表示,将要表示的字符串包裹在 " " 中就可以了。也就是说,并不需要把 null 字符显式的放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。

char greeting[] = "Hello";

C 中内置的字符串操作函数:

#include <stdio.h>
#include <string.h>int main ()
{char str1[12] = "Hello";char str2[12] = "World";char str3[12];int  len ;/* 复制 str1 到 str3 */strcpy(str3, str1);printf("strcpy( str3, str1) :  %s\n", str3 );/* 连接 str1 和 str2 */strcat( str1, str2);printf("strcat( str1, str2):   %s\n", str1 );/* 连接后,str1 的总长度 */len = strlen(str1);printf("strlen(str1) :  %d\n", len );return 0;
}

运行:

strcpy( str3, str1) :  Hello
strcat( str1, str2):   HelloWorld
strlen(str1) :  10

字符串拷贝

char * strcpy( char * dst, const char * src );

strcpy() 是一个标准库函数,把从 src 地址开始且含有 ’\0’ 结束符的字符串复制到以 dest 开始的地址空间,返回值的类型为 char*。

NOTE:当我们在程序中使用 char *str 来存储一个字符串时,实际上并不安全,而是应该使用一个真实的、定长的数组来进行存储。

static char str2[20];...
char *str1 = "123"
strcpy(str2, str1)

字符串比较

C 标准库中的字符串比较有两个标准函数:strcmp 和 strncmp。

  • strcmp
int strcmp (const char* src, const char* dst)
  • strncmp
int strncmp(const char* src, const char* dst, size_t n)

从两者的函数原型可以看出,strncmp 多出来了一个 “比较长度” 的形参,这也导致了在某些场景中使用 strncmp 会比 strcmp 更安全的结果。

strcmp

  • 若 str1 == str2,则返回零;
  • 若 str1 > str2,则返回正数;
  • 若 str1< str2,则返回负数。

两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 “\0” 为止,例如:

  • strcmp("abcd", "abcd") 的返回值是 0;
  • strcmp("abcd", "dcba") 的返回值是 -1;
  • strcmp("dcba", "abcd") 的返回值是 1;

除了比较两个字符串之外,还可以用于比较数组和字符串,因为字符串本质就是一个数组。

strncmp

strncmp 可以指定比较 size_t n 个字符。也就是说,如果字符串 s1 与 s2 的前 n 个字符相同,则函数返回值为 0。反正,则依次比较 s1 和 s2 的前 n 位,若第 i(i < n)个字符为首次的不同位,则返回:s1[i] - s2[i]

  • str1 小于 str2,返回值就 <0;
  • str1 大于 str2,返回值就 >0;
  • str1 等于 str2,返回值就 =0;

例如:str1=“ABCDHG”,str2=“ABCDEF”。

  • strncmp(str1, str2, 4) 返回值是 0;
  • strncmp(str1, str2, 5) 返回值是 1;

可见,当我们比较两个长度不一致的字符串时,我们最好可以指定比较的 size_t n,确保 “有效字符” 的内容是一致的,而不会因为 “非预期的填充内容” 导致比较失败

案例:

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<string.h>
#include<stdlib.h>#pragma warning(disable:6031)int main(int argc, char* argv[]) {char fileName[256];printf("请您输入一个需要创建的文件:\n");scanf("%s",fileName);getchar(); // 换行FILE * fp = fopen(fileName, "w");if (fp == NULL){return -1;}// scanf("%[^\n]", buf); 可以接受 空格// fgets()printf("请您往文件中的存入数据:\n");char buf[1024];memset(buf, 0, 1024);while (1) {/* scanf("%[^\n]", buf); */// 输入多行不能再用 scanf 因为换行 scanf 就没用了fgets(buf, 1024, stdin);if (strncmp("Exit", buf,4)==0) {// 不能用 strcmp 因为 fgets 会带 \0 所以始终无法相等 ,用 strncmp 只比较字符部分,就可以达到效果。break;}int i = 0;while (buf[i] != '\0') {fputc(buf[i++], fp);}}fclose(fp);system("pause");return EXIT_SUCCESS;
}

C 语言编程 — 高级数据类型 — 字符串相关推荐

  1. C 语言编程 — 高级数据类型 — void 类型

    目录 文章目录 目录 前文列表 void 类型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> & ...

  2. C 语言编程 — 高级数据类型 — 共用体

    目录 文章目录 目录 前文列表 共用体 定义共用体 访问共用体成员 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本 ...

  3. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  4. C 语言编程 — 高级数据类型 — 枚举

    目录 文章目录 目录 前文列表 声明枚举类型 定义枚举类型的变量 枚举类型变量的枚举值 枚举在 switch 语句中的使用 将整型转换为枚举类型 前文列表 <程序编译流程与 GCC 编译器> ...

  5. C 语言编程 — 高级数据类型 — 数组

    目录 文章目录 目录 前文列表 数组 声明数组 初始化数据 访问数组元素 二维数组 指向数组的指针 将数组指针作为实参传入函数 从函数返回一个数组指针 指针数组 数组名和取数组首地址的区别 前文列表 ...

  6. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明一个指针变量 使用指针 空指针 悬空指针 野指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 < ...

  7. Go 语言编程 — 高级数据类型 — 结构体

    目录 文章目录 目录 结构体 访问结构体成员 向函数传递结构体 结构体指针 结构体标签(Struct Tag) 结构体 Golang 中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.与 ...

  8. Go 语言编程 — 高级数据类型 — Interface、多态、Duck Typing 与泛式编程

    目录 文章目录 目录 Golang 的接口 Interface 实例存储的是实现者的值 如何判断某个 Interface 实例的实际类型 Empty Interface Interface 与多态 I ...

  9. Go 语言编程 — 高级数据类型 — Map 集合

    目录 文章目录 目录 集合 定义 Map delete() 函数 实现简单 HashMap 集合 集合(Map)是一种无序的 HASH 键值对集合.通过 key 来快速检索 value,所以我们可以像 ...

最新文章

  1. 1 元秒杀 1000+ 册爆款电子书,错过再等一年!
  2. 【python】关于python的链表结构实现
  3. 2016-8-18晨型养成第三天
  4. android开发之当设置textview多少字后以省略号显示。限制TextView的字数
  5. 阿里不让 MySQL 多表 Join ?我偏要!
  6. centos7.6成功安装nerdtree插件
  7. BugkuCTF-Misc:come_game
  8. mysql未提交事务sql_MySQL如何找出未提交事务的SQL浅析
  9. 渗透测试流程信息收集
  10. vue隐藏和显示元素
  11. 0005-Windows Kerberos客户端配置并访问CDH
  12. 【算法】普通方法和筛选法求素数
  13. 或许你不知道的10条SQL技巧
  14. 排序算法--基数排序
  15. json标准格式举例_JSON 数据格式详解
  16. exe应用程序无法启动,因为应用程序的并行配置不正确
  17. 社交网络影响力最大化——贪心算法实现(Python实现)
  18. 华硕鹰眼ZenFone Zoom推动潮流:比肩专业相机几率几何?
  19. php 发 语音验证码,分享一下子语音验证码的php开发流程
  20. 电脑连接无线路由上不了网 连接手机热点却可以上网

热门文章

  1. 2017android开发找不到工作,揭秘蒋多多2017生活现状,30岁找不到工作曾绝望自杀...
  2. qt调用c语言编写的dll文件,Qt之调用外部DLL - moki_oschina的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. java io nio socket_通过socket编程掌握IO流 —— NIO
  4. 前端不规则图像点击_css实现不规则图形的阴影(如对话框)
  5. css如何设置图转30度,使用CSS实现左右30度的摆钟
  6. python编程与特征提取_Python进行特征提取的示例代码
  7. Python-EEG工具库MNE中文教程(8)-参考电极简介
  8. seaborn系列 (12) | 增强箱图boxenplot()
  9. 网易云音乐IPO现场:丁石石石石石石石石石敲钟
  10. 关于MEET大会直播抽奖后续红包发放的说明