zoukankan      html  css  js  c++  java
  • C 语言编程 — 高级数据类型 — 字符串

    目录

    前文列表

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

    字符串

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

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

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

    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
    ", str3 );
     
       /* 连接 str1 和 str2 */
       strcat( str1, str2);
       printf("strcat( str1, str2):   %s
    ", str1 );
     
       /* 连接后,str1 的总长度 */
       len = strlen(str1);
       printf("strlen(str1) :  %d
    ", len );
     
       return 0;
    }
    

    运行:

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

    字符串拷贝

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

    strcpy() 是一个标准库函数,把从 src 地址开始且含有 ’’ 结束符的字符串复制到以 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 值大小相比较),直到出现不同的字符或遇 “” 为止,例如:

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

    相关阅读:

  • 相关阅读:
    DRF频率、分页、解析器、渲染器
    DRF的版本、认证、权限
    Django Rest Framework 视图和路由
    restfull规范
    DRF序列化
    类的super
    AngularJs自定义指令详解(1)
    AngularJs自定义指令详解(5)
    angular 自定义指令详解 Directive
    require js define 函数
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309357.html
Copyright © 2011-2022 走看看