首页 > 其他分享 >08. 字符串

08. 字符串

时间:2023-02-27 12:33:44浏览次数:39  
标签:字符 08 char 数组 printf 字符串 array

一、什么是字符串

  字符串是一个或多个字符的序列,它使用一对双引号包裹起来,以 '\0' 作为字符串的结束标志。在 C语言 中,我们可以使用 字符数组 来保存字符串,也就是使用一个一维字符数组保存字符串中的每一个字符。此时,编译器会自动为其添加 '\0' 作为结束符。

char array[] = "hello world";

  我们也可以使用字符指针的方式来定义字符串;C语言 对字符串常量是按字符数组处理的,在内存中开辟了一个字节数组用来存放字符串常量,程序在定义字符串指针变量时只是把字符串首地址(即存放字符串的字节数组的首地址)赋给指针变量。

char *str = "hello world";

  字符数组是若干个元素组成的,每个元素放一个字符,而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中。对字符数组除了定义时可以使用字符串整体赋值,其它情况下只能单个元素赋值。对字符指针可以使用字符串整体赋值;

  如果定义了一个字符数组,那么它有确定的内存地址(即字符数组名是一个常量),而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。

程序中往往依靠检测 '\0' 的位置来判断字符串是否结束,而不是根据数组的长度来决定字符串长度。因此,字符串长度不会统计 '\0' ,字符数组长度会统计;

在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度,否则,在输出字符数组时可能出现未知字符;

系统对字符串常量也会自动添加一个 '\0' 作为结束符;

定义字符数组时,如果给的字符个数比数组的长度小,则系统会默认将剩余的元素空间,全部设置为 '\0';

二、字符串的输入输出

  我们可以使用格式符 "%c" 实现字符数组中字符的输出。

#include <stdio.h>

int main()
{
    char array[] = "hello world!";
    int i = 0;

    while(array[i])
    {
        printf("%c",array[i]);
        i++;
    }

    return 0;
}

  还可以使用格式符 "%s" 进行输入和输出。

#include <stdio.h>

int main()
{
    char array[15];
    int i = 0;

    printf("请输入一个字符串:\n");
    scanf("%14s",array);
    // 通过正则表达式,获取带空格字符串
    //scanf("%[^\n]",array);

    printf("你输入的字符串为:\n");
    printf("%s\n",array);

    return 0;
}

由于 scanf() 函数无法知道要输入字符串的大小,必须遇到换行符或读到文件结尾位置才接收输入,因此容易导致字符数组越界的情况。

  我们还可以通过 gets() 函数输入字符串,puts() 函数输出字符串。由于 gets() 函数无法知道要输入字符串的大小,必须遇到换行符或读到文件结尾位置才接收输入,因此容易导致字符数组越界的情况。gets() 函数接收字符串可以带空格;puts() 函数自带换行。

#include <stdio.h>

int main()
{
    char array[15];

    printf("请输入字符串:\n");
    gets(array);

    printf("你输入的字符串为:\n");
    puts(array);

    return 0;
}

  我们还可以通过 fgets() 函数输入字符串,fputs() 函数输出字符串。fgets() 函数在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过 scanf() 函数和 gets() 函数输入一个字符串的时候,不包含结尾的“\n”,但通过 fgets() 函数结尾多了“\n”。fgets() 函数是安全的,不存在缓冲区溢出的问题。

#include <stdio.h>

int main()
{
    char array[15];

    printf("请输入字符串:\n");
    fgets(array,sizeof(array),stdin);

    printf("你输入的字符串为:\n");
    fputs(array,stdout);

    return 0;
}

fgets() 获取字符串少于元素个数会有 '\n',大于等于没有 '\n'。

三、字符串处理函数

3.1、字符串长度

size_t strlen( const char *str );    // 获取源字符串的有效长度
#include <stdio.h>
#include <string.h>

int main()
{
    char array[15] = "hello world!" ;
    int length = 0;

    length = strlen(array);

    printf("字符串的长度为:%d\n",length);

    length = 0;
    while(array[length])
        length++;
    printf("字符串的长度为:%d\n",length);

    return 0;
}

3.2、字符串复制

char *strcpy( char *dest, const char *src );                   // 复制源字符串数组到目标字符串中
char *strncpy( char *dest, const char *src, size_t count );    // 复制源字串的n个字符复制到目标字符串中
#include <stdio.h>
#include <string.h>

int main()
{
    char array[15] = "hello world!" ;
    char array1[15] = {0};
    char array2[15] = {0};
  
    strcpy(array1,array);
    printf("%s\n",array1);

    strncpy(array2,array,5);
    printf("%s\n",array2);

    return 0;
}

3.3、字符串连接

char *strcat( char *dest, const char *src );                 // 将源数组的字符串连接到目标数组后
char *strncat( char *dest, const char *src, size_t count );  // 将源数组的指定个数字符连接到目标数组后
#include <stdio.h>
#include <string.h>

int main()
{
    char array1[15] = "hello " ;
    char array2[15] = "hello " ;
    char array3[15] = "world!";
  
    strcat(array1,array3);
    printf("%s\n",array1);

    strncat(array2,array3,5);
    printf("%s\n",array2);

    return 0;
}

3.4、字符串比较

  字符串比较就是将一个字符串与另一个字符串从首字母开始,按照 ASCII 码的顺序进行逐个比较。在 C语言中,通过 strcmp() 函数 或者 strncmp() 函数进行字符串的比较。

int strcmp( const char *lhs, const char *rhs );                  // 将两个字符串从首字符按ASCII进行比较,相同返回0,lhs大返回整数,rhs大返回负数
int strncmp( const char *lhs, const char *rhs, size_t count );   // 将两个字符串前count字符按ASCII进行比较,相同返回0,lhs大返回整数,rhs大返回负数

  strcmp() 函数 和 strcmp() 函数的功能就是按照 ASCII 码的顺序比较两个数组中的字符串,并由函数返回值返回函数结果:

  • 字符串1 = 字符串2,返回值为 0
  • 字符串1 > 字符串2,返回值为 正数
  • 字符串1 < 字符串2,返回值为 负数
#include <stdio.h>
#include <string.h>

int main()
{
    char array1[15] = "hello world!" ;
    char array2[15] = "hello sakura!" ;
    int result = 0;

    result = strcmp(array1,array2);

    if(result < 0)
    {
        printf("第一个字符串大\n");
    }
    else if(result > 0){
        printf("第二个字符大\n");
    }
    else{
        printf("两个字符串相等\n");
    }

    result = strncmp(array1,array2,5);

    if(result < 0)
    {
        printf("第一个字符串大\n");
    }
    else if(result > 0){
        printf("第二个字符大\n");
    }
    else{
        printf("两个字符串前5个字符相等\n");
    }

    return 0;
}

标签:字符,08,char,数组,printf,字符串,array
From: https://www.cnblogs.com/kurome/p/17159239.html

相关文章