关键词搜索

源码搜索 ×
×

C 语言编程 — 构造数据类型 — 字符串(string)

发布2023-03-11浏览2228次

详情内容

目录

字符串

C 语言没有原生的字符串数据类型,本质还是一个字符数组,数组元素类型为 char*,并以一个空字符(‘\0’)结尾。

下面的定义了一个 “Hello” 字符数组,由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。

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

    从可读性上考虑,C 语言的字符串还支持 “字面量" 表示方式,使用 “” 双引号。编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。

    char greeting[] = "Hello";
    

      在这里插入图片描述

      字符串操作函数

      C 语言内置了多种字符串操作函数:

      在这里插入图片描述

      strlen() 字符串长度

      • strlen() 函数,用于计算一个以 “\0”(null)结尾的 String 的长度,即它的字符数,且不包括 null 终止符。
      size_t strlen(const char *str);
      

        strcpy() 字符串拷贝

        • strcpy() 函数,用于把从 src 地址开始且含有 ’\0’(null)结束符的 String,复制到以 dest 地址开始的空间,返回值的类型为 char*。
        char * strcpy( char * dst, const char * src );
        

          示例代码:

          #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;
          }
          
            2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24

          运行:

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

          字符串比较

          strcmp() 相同比较

          int strcmp (const char* src, const char* dst)
          

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

            • strcmp("abcd", "abcd"),str1 == str2,则返回 0;
            • strcmp("dcba", "abcd"),str1 > str2,则返回 1;
            • strcmp("abcd", "dcba"),str1 < str2,则返回 -1;

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

            strncmp() 带长度的相同比较

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

              strncmp 比 strcmp 多出来了一个 “比较长度” 的形参 size_t n,这也导致了在某些场景中使用 strncmp 会比 strcmp 更安全的结果。

              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;
              	}
              
              	char buf[1024];
              	printf("请您往文件中的存入数据:\n");
              	memset(buf, 0, 1024);
              	
              	while (1) {
              		fgets(buf, 1024, stdin);
              		// 不能用 strcmp 因为 fgets 会带 \0 所以始终无法相等 ,用 strncmp 只比较字符部分,就可以达到效果。
              		if (strncmp("Exit", buf, 4) == 0) {			
              			break;
              		}
              		int i = 0;
              		while (buf[i] != '\0') {
              			fputc(buf[i++], fp);
              		}
              	}
              	fclose(fp);
              	system("pause");
              	return EXIT_SUCCESS;
              }
              
                2
              • 3
              • 4
              • 5
              • 6
              • 7
              • 8
              • 9
              • 10
              • 11
              • 12
              • 13
              • 14
              • 15
              • 16
              • 17
              • 18
              • 19
              • 20
              • 21
              • 22
              • 23
              • 24
              • 25
              • 26
              • 27
              • 28
              • 29
              • 30
              • 31
              • 32
              • 33
              • 34
              • 35
              • 36
              • 37
              • 38
              • 39
              • 40

              strcasecmp() 忽略大小写的比较

              **strcasecmp() ** 函数,用于比较两个字符串是否相同,不区分大小写。

              函数原型

              int strcasecmp(const char *str1, const char *str2);
              

                函数返回值

                • 如果两个字符串相等(忽略大小写),则返回值为 0。
                • 如果 str1 > str2(忽略大小写),则返回值为正数。
                • 如果 str1 < str2(忽略大小写),则返回值为负数。

                需要注意的是,strcasecmp() 函数只保证对 ASCII 字符集,对于其他字符集可能会出现问题。在处理非 ASCII 字符集的情况下,可以使用 strcoll() 函数或者 ICU 库提供的函数进行字符串比较。

                字符串编写规范

                1. 不要将长度不明确的字符串写到长度固定的数组中,而是使用指针的方式。

                2. . 广泛使用 sizeof、strlen 函数来计算结构体、数组、字符串的长度,避免手工计算。

                3. 字符串最后必须是 ‘\0’ 结束的,标准字符串处理函数,如 strcpy、strlen 依赖 NULL 结束符来确定字符串的长度。

                4. 避免使用危险函数来操作字符串,例如:sprintf、vsprintf、strcpy、strcat、strcmp、gets 等;而是应该使用相对安全的函数来操作,例如:snprintf、strncpy、strncat、strncmp、fgets 等。

                相关技术文章

                点击QQ咨询
                开通会员
                返回顶部
                ×
                微信扫码支付
                微信扫码支付
                确定支付下载
                请使用微信描二维码支付
                ×

                提示信息

                ×

                选择支付方式

                • 微信支付
                • 支付宝付款
                确定支付下载