C语言之字符串、字符数组,字符串函数

    xiaoxiao2021-04-02  48

    ============1.字符数组:

    用来存放字符的数组称为字符数组,例如:

    char a[10];  //一维字符数组

    char b[5][10];  //二维字符数组

    char c[20]={'c', '  ', 'p', 'r', 'o', 'g', 'r', 'a','m'};  // 给部分数组元素赋值

    char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' };  //对全体元素赋值时可以省去长度

    字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。

    C语言规定,可以将字符串直接赋值给字符数组,例如:

    char str[30] = {"c.biancheng.net"};

    char str[30] = "c.biancheng.net"//这种形式更加简洁,实际开发中常用

    数组第0个元素为 'c',第1个元素为 '.',第2个元素为 'b',后面的元素以此类推。也可以不指定数组长度,例如:

    char str[] = {"c.biancheng.net"};

    char str[] = "c.biancheng.net"//这种形式更加简洁,实际开发中常用

    C语言中,字符串总是以'\0'作为串的结束符上面的两个字符串,编译器已经在末尾自动添加了'\0'

    '\0'ASCII码表中的第0个字符,用NUL表示,称为空字符。该字符既不能显示,也不是控制字符,输出该字符不会有任何效果,它在C语言中仅作为字符串的结束标志。

    puts printf 在输出字符串时会逐个扫描字符,直到遇见 '\0' 才结束输出。请看下面的例子:

    #include <stdio.h>

    int main(){

        int i;

        char str1[30] = "http://c.biancheng.net";

        char str2[] = "C Language";

        char str3[30] = "You are a good\0 boy!";

        printf("str1: %s\n", str1);

        printf("str2: %s\n", str2);

        printf("str3: %s\n", str3);

        return 0;

    }

    运行结果:

    str1: http://c.biancheng.net

    str2: C Language

    str3: You are a good

    str1 str2 很好理解,编译器会在字符串最后自动添加 '\0',并且数组足够大,所以会输出整个字符串。对于 str3由于字符串中间存在 '\0'printf() 扫描到这里就认为字符串结束了,所以不会输出后面的内容。

    需要注意的是,用字符串给字符数组赋值时由于要添加结束符 '\0',数组的长度要比字符串的长度(字符串长度不包括 '\0')大1。例如:

    char str[] = "C program";

    该数组在内存中的实际存放情况为:

    字符串长度为 9,数组长度为 10

    *********字符串也可以用一个指针表示:

      char *p="ddd";

    =================字符串操作函数:

    用于输入输出的字符串函数,例如printfputsscanfgets等,使用时应包含头文件stdio.h,使用其它字符串函数则应包含头文件string.h

    ***********字符串长度函数strlen

    strlen 是 用来获得字符串的长度。所谓长度,就是包含多少个字符(不包括字符串结束标志 '\0')。语法格式为: strlen(arrayName); strlen 将返回字符串的长度,它是一个整数。请看下面的例子: #include <stdio.h> #include <string.h> int main(){ char str[]="C language"; int len = strlen(str); printf("The lenth of the string is %d\n", len); return 0; } 运行结果: The lenth of the string is 10 需要说明的是,strlen 会从字符串的第 0 个字符开始计算,直到遇到字符串结束标志 '\0'。将上面代码中的 str 改为: char str[]="C \0language"; 那么输出结果就是: The lenth of the string is 2

    ***********字符串连接函数 strcat strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为:

    strcat(arrayName1, arrayName2); arrayName1、arrayName2 为需要拼接的字符串。 strcat 将把 arrayName2 连接到 arrayName1 后面,并删去 arrayName1 最后的结束标志 '\0'。 这就意味着,arrayName1 的长度要足够,必须能够同时容纳 arrayName1 和 arrayName2,否则会越界。 strcat 返回值为 arrayName1 的首地址。

    *****************字符串复制函数strcpy strcpy 是 string copy 的缩写,意思是字符串复制,语法格式为:

    strcpy(arrayName1, arrayName2); strcpy 会把 arrayName2 中的字符串拷贝到 arrayName1 中,串结束标志 '\0' 也一同拷贝 strcat 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串。

    ============字符串比较函数strcmp strcmp 是 字符串比较,语法格式为:

    strcmp(arrayName1, arrayName2); arrayName1 和 arrayName2 是需要比较的两个字符串。 字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。 返回值:若 arrayName1 和 arrayName2 相同,则返回0;若 arrayName1 大于 arrayName2,则返回大于 0 的值;若 arrayName1 小于 arrayName2,则返回小于0 的值。

    ===============字符串的输出 在C语言中,输出字符串的函数有两个:

    puts():直接输出字符串,并且只能输出字符串。printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。

    ==============字符串的输入

    在C语言中,输入字符串的函数有两个: scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。gets():直接输入字符串,并且只能输入字符串。 *************

    1) 使用 scanf() 读取字符串

    请先看下面的例子: #include <stdio.h>int main(){ char str1[30], str2[30]; printf("Input str1: "); scanf("%s", str1); printf("Input str2: "); scanf("%s", str2); printf("str1: %s\nstr2: %s\n", str1, str2); return 0;} 运行结果: Input str1: c.biancheng.net↙ Input str2: Java Python C-Sharp↙ str1: c.biancheng.net str2: Java 由于字符数组长度为30,因此输入的字符串长度必须小于30,以留出一个字节用于存放字符串结束标志`\0`。 对程序的说明: ① 我们本来希望将 "Java Python C-Sharp" 赋值给 str2,但是 scanf() 只读取到 "Java", 这是因为 scanf() 读取到空格时就认为字符串输入结束了 ,不会继续读取了。请看下面的例子: #include <stdio.h>int main(){ char str1[20], str2[20], str3[20]; printf("Input string: "); scanf("%s", str1); scanf("%s", str2); scanf("%s", str3); printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3); return 0;} 运行结果: Input string: Java Python C-Sharp↙ str1: Java str2: Python str3: C-Sharp 第一个 scanf() 读取到 "Java" 后遇到空格,结束读取,将"Python C-Sharp" 留在缓冲区。第二个 scanf() 直接从缓冲区中读取,不会等待用户输入,读取到 "Python" 后遇到空格,结束读取,将 "C-Sharp" 留在缓冲区。第三个 scanf() 读取缓冲区中剩下的内容。 scanf 的各个变量前面要加取地址符 & ,用以获得变量的地址,例如: int a, b; scanf("%d %d", &a, &b); 但是在本节的示例中,将字符串读入字符数组却没有使用 & ,例如: char str1[20], str2[20], str3[20], str4[20]; scanf("%s %s %s %s",str1, str2, str3, str4); 这是因为C语言规定,数组名就代表了该数组的地址。 整个数组是一块连续的内存单元,如有字符数组char c[10],在内存可表示为: C语言还规定,数组名所代表的地址为第0个元素的地址,例如 char c[10]; c 就代表 c[0] 的地址。第0个元素的地址就是数组的起始地址,称为 首地址 也就是说,数组名表示数组的首地址。 设数组c的首地址为0X2000,也即c[0]地址为0X2000,则数组名c就代表这个地址。因为c已经表示地址,所以在c前面不能再加取地址符&,例如写作 scanf("%s",&c); 是错误的。 有了首地址,有了字符串结束符'\0',就可以在内存中完整定位一个字符串了。例如: printf("%s", c); printf 函数会根据数组名找到c的首地址,然后逐个输出数组中各个字符直到遇到 '\0' 为止。 ********************* gets 是 获取用户从键盘输入的字符串,语法格式为: gets(arrayName); arrayName 为字符数组。从键盘获得的字符串,将保存在 arrayName 中。请看下面的例子: #include <stdio.h>int main(){ char str1[30], str2[30]; printf("Input str1: "); gets(str1); printf("Input str2: "); gets(str2); printf("str1: %s\nstr2: %s\n", str1, str2); return 0;} 运行结果: Input str1: Java Python C-Sharp↙ Input str2: http://c.biancheng.net↙ str1: Java Python C-Sharp str2: http://c.biancheng.net 可以发现,当输入的字符串中含有空格时,输出仍为全部字符串,这说明 gets() 函数不会把空格作为输入结束的标志,而只把回车换行作为输入结束的标志,这与 scanf() 函数是不同的。 总结:如果希望读取的字符串中不包含空格,那么使用 scanf() 函数;如果希望获取整行字符串,那么使用 gets() 函数,它能避免空格的截断

    转载请注明原文地址: https://ju.6miu.com/read-665744.html

    最新回复(0)