C语言进阶教程之字符串&内存函数

yizhihongxing

C语言进阶教程之字符串&内存函数

字符串

字符串的定义

在C语言中,字符串是由一串字符组成的数组。数组中的元素都是字符类型,每一个字符都是占1个字节的ASCII码。字符串以'\0'结尾,'\0'称为空字符(null character),也就是字符串的结束标志。

下面是一个包含字符串的数组的定义:

char str[] = "Hello World!";

这个字符串由12个可见字符和一个隐藏的空字符('\0')组成,所以它的长度为13个字节。

字符串的读取

gets函数

在C语言中,可以通过调用gets()函数从标准输入中读取一个字符串,它的原型如下:

char *gets(char *s);

示例代码如下:

#include <stdio.h>

int main() {
    char str[50];

    printf("Enter a string: ");
    gets(str);

    printf("You entered: %s\n", str);

    return 0;
}

在运行时,会让用户输入一个字符串,然后将输入的字符串赋值给str,最后打印输入的字符串。

fgets函数

gets()函数已经被弃用,因为它存在安全问题,也就是它读取的字符串长度必须小于缓冲区长度,否则会发生缓冲区溢出。为了解决这个问题,C语言还提供了一个更安全的函数fgets()

fgets()函数可以读取指定长度的字符串,因此比gets()函数更安全。它的原型如下:

char *fgets(char *s, int size, FILE *stream);

其中,size表示允许读取的最大字节数,stream表示输入的数据流。如果读取成功,fgets()函数返回所读取的字符串,如果出现错误或者到达文件结尾,返回NULL

示例代码如下:

#include <stdio.h>

int main() {
    char str[50];

    printf("Enter a string: ");
    fgets(str, 50, stdin);

    printf("You entered: %s\n", str);

    return 0;
}

在运行时,它会让用户输入一个长度小于50字节的字符串,并将输入的字符串赋值给str,最后打印输入的字符串。

字符串的拼接

在C语言中,可以通过调用strcat()函数将两个字符串拼接在一起,它的原型如下:

char *strcat(char *dest, const char *src);

其中,dest表示拼接后的目标字符串,src表示需要拼接的源字符串。需要注意的是,dest字符串必须有足够的空间容纳src字符串,否则会发生缓冲区溢出。

示例代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello ";
    char str2[] = "World!";

    strcat(str1, str2);

    printf("The concatenated string is: %s\n", str1);

    return 0;
}

在运行时,它会将str2拼接到str1的末尾,最后打印拼接完成的字符串。

内存函数

内存函数的定义

在C语言中,有一些内存函数可以用来操作内存中的数据。这些函数通常被用来动态分配内存、释放内存、复制内存等。

内存分配函数

malloc函数

malloc()函数可以动态分配内存空间,它的原型如下:

void *malloc(size_t size);

其中,size表示需要分配的字节数,返回分配到的内存空间的起始地址。如果分配失败,则返回NULL

示例代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
   int *ptr;
   int n = 5;

   ptr = (int*)malloc(n * sizeof(int));

   if (ptr == NULL) {
      printf("Memory allocation failed!\n");
      exit(0);
   }

   for (int i = 0; i < n; i++) {
      ptr[i] = i + 1;
   }

   printf("The elements of the array are: ");

   for (int i = 0; i < n; i++) {
      printf("%d ", ptr[i]);
   }

   free(ptr);

   return 0;
}

在运行时,它会分配5个整型变量大小的内存空间,然后将其中的值进行打印,并最后释放内存空间。

calloc函数

calloc()函数与malloc()函数类似,它也可以用来动态分配内存空间,不同之处在于calloc()在分配内存时会将内存空间初始化为0,而malloc()函数不会。它的原型如下:

void *calloc(size_t nmemb, size_t size);

其中,nmemb表示需要分配的元素个数,size表示每个元素的大小,返回分配到的内存空间的起始地址。如果分配失败,则返回NULL

示例代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
   int *ptr;
   int n = 5;

   ptr = (int*)calloc(n, sizeof(int));

   if (ptr == NULL) {
      printf("Memory allocation failed!\n");
      exit(0);
   }

   for (int i = 0; i < n; i++) {
      printf("%d ", ptr[i]);
   }

   free(ptr);

   return 0;
}

在运行时,它会初始化5个整型变量大小的内存空间,然后将其中的值进行打印,并最后释放内存空间。

realloc函数

realloc()函数可以用来重新分配内存空间,它的原型如下:

void *realloc(void *ptr, size_t size);

其中,ptr表示需要重新分配内存空间的指针,size表示需要分配的新的内存空间大小。如果分配成功,则返回新的内存空间地址,否则返回NULL。需要注意的是,如果ptrNULL,则等价于调用malloc()函数。

示例代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;
    int n1 = 5, n2 = 10;

    ptr = (int*)malloc(n1 * sizeof(int));

    if (ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(0);
    }

    for (int i = 0; i < n1; i++) {
        ptr[i] = i + 1;
    }

    ptr = realloc(ptr, n2 * sizeof(int));

    if (ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(0);
    }

    for (int i = n1; i < n2; i++) {
        ptr[i] = i + 1;
    }

    printf("The elements of the array are: ");

    for (int i = 0; i < n2; i++) {
        printf("%d ", ptr[i]);
    }

    free(ptr);

    return 0;
}

在运行时,它会分配5个整型变量大小的内存空间,并将其中的值进行打印。接着,它通过调用realloc()函数重新将内存大小重新分配为10个整型变量大小,然后将其中的值进行打印,并最后释放内存空间。

内存释放函数

free函数

free()函数可以用来释放由malloc()calloc()realloc()函数动态分配的内存空间。它的原型如下:

void free(void *ptr);

其中,ptr表示需要释放的内存空间地址。

示例代码如下:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;
    int n = 5;

    ptr = (int*)malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(0);
    }

    for (int i = 0; i < n; i++) {
        ptr[i] = i + 1;
    }

    printf("The elements of the array are: ");

    for (int i = 0; i < n; i++) {
        printf("%d ", ptr[i]);
    }

    free(ptr);

    return 0;
}

在运行时,它会分配5个整型变量大小的内存空间,并将其中的值进行打印。接着,它通过调用free()函数释放内存空间。

内存复制函数

memcpy函数

memcpy()函数可以用来复制内存空间中的数据,它的原型如下:

void *memcpy(void *dest, const void *src, size_t n);

其中,dest表示目标内存空间地址,src表示源内存空间地址,n表示需要复制的字节数。

示例代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char src[50] = "Hello World!";
    char dest[50];

    memcpy(dest, src, strlen(src) + 1);

    printf("The copied string is: %s\n", dest);

    return 0;
}

在运行时,它会将源字符串src复制到目标字符串dest中,然后打印复制完成的字符串。

memmove函数

memmove()函数与memcpy()函数类似,也可以用来复制内存空间中的数据,不同之处在于当源内存区域与目标内存区域重叠时,memmove()函数能够保证复制过程正确。它的原型如下:

void *memmove(void *dest, const void *src, size_t n);

其中,dest表示目标内存空间地址,src表示源内存空间地址,n表示需要复制的字节数。

示例代码如下:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "memmove can work with overlapping areas!";

    memmove (str+20, str+15, 11);

    printf ("Result: %s\n", str);

    return 0;
}

在运行时,它会将源字符串中部分字符复制到目标字符串的后面,然后打印复制完成的字符串。

总结

本文介绍了C语言中的字符串和内存函数。字符串是由一串字符组成的数组,可以通过gets()或者fgets()函数读取字符串,通过strcat()函数拼接字符串。内存函数包括动态分配函数、内存释放函数、内存复制函数,可以通过malloc()calloc()realloc()函数动态分配内存空间,通过free()函数释放内存空间,通过memcpy()memmove()函数复制内存空间中的数据。这些函数在C语言程序中有着广泛的应用,能够提高程序的灵活性和效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言进阶教程之字符串&内存函数 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++实现合并两个排序的链表

    C++实现合并两个排序的链表 前言 本文介绍使用C++实现合并两个排序的链表的攻略。在介绍具体操作之前,我们需要了解一下链表的基本概念和操作。 链表基本概念和操作 链表是一种常见的数据结构,用于存储一系列的元素。每个元素都包含一个存储数据的字段和一个(或多个)指向下一个元素的指针。 链表有以下几个基本操作: 插入元素(在链表头或指定位置插入) 删除元素(删除…

    other 2023年6月27日
    00
  • UML中类图的四种关系及其代码实现

    下面是“UML中类图的四种关系及其代码实现的完整攻略”,包括类图的基本介绍、四种关系的介绍、代码实现的步骤和两个示例说明。 类图的基本介绍 类图是UML中最常用的图之一,用于表示系统中的类、接口、关系和其它结构。类图可以帮助开发人员更好地理解系统的结构和设计,从而更好地进行开发和维护。 四种关系的介绍 在类图中,有四种基本的关系,分别是: 泛化关系(Gene…

    other 2023年5月5日
    00
  • 仿iPhone通讯录制作小程序自定义选择组件的实现

    针对“仿iPhone通讯录制作小程序自定义选择组件的实现”的攻略,我可以提供以下几点详细讲解: 1. 实现思路 我们首先需要明确的是,我们要实现的是一个自定义选择组件,该组件应该至少拥有以下几个特点: 可滑动选择 带有动画效果 可以自定义选择项(例如可以用于选择省份、城市、日期等) 针对以上需求,我们可以参考下面的实现思路: 使用小程序的基本组件和API,例…

    other 2023年6月25日
    00
  • Win11 Canary Build 25387.1200预览版今日发布: 主要用于测试服务管道

    Win11 Canary Build 25387.1200预览版攻略 Win11 Canary Build 25387.1200是Windows 11操作系统的预览版之一,旨在测试服务管道的功能和稳定性。本攻略将详细介绍如何安装和使用该预览版,并提供两个示例说明。 步骤1:准备工作 在开始之前,请确保你已经满足以下要求: 一台兼容的计算机,满足Windows…

    other 2023年8月3日
    00
  • 08001无法远程连接sqlserver数据库800

    如果您在远程连接SQL Server数据库时遇到了“08001无法远程连接SQL Server数据库800”错误,可以按照以下步骤进行排查: 首先,您需要确认SQL Server是否已启用远程连接。默认情况下,SQL Server不允许远程连接。您可以按照以下步骤启用远程连接: 打开SQL Server Configuration Manager。 选择SQ…

    other 2023年5月7日
    00
  • 鸿蒙HAIWEI DevEco Studio安装配置运行Hello World的实现

    鸿蒙HAIWEI DevEco Studio安装配置运行Hello World的实现攻略 1. 安装鸿蒙HAIWEI DevEco Studio 首先,你需要下载并安装鸿蒙HAIWEI DevEco Studio。你可以在华为官方网站上找到最新版本的下载链接。安装过程与其他常见的开发工具类似,按照安装向导进行操作即可。 2. 配置鸿蒙HAIWEI DevEc…

    other 2023年7月27日
    00
  • c++使用ifstream读取文件

    在C++中,我们可以使用ifstream类来读取文件。ifstream类是C++标准库中的一个输入流类,它可以用于从文件中读取数据。本攻略将介绍如何使用ifstream类读取文件,包括打开文件、读取文件内容和关闭文件。我们将提供两个示例,展示了如何使用ifstream类读取文本文件和二进文件。 打开文件 在使用ifstream读取文件之前,我们需要先打文件。…

    other 2023年5月9日
    00
  • 三星2022 Type-C U盘值得入手吗?三星Type-C U盘使用评测

    当然,下面是关于三星2022 Type-C U盘的完整攻略,包含两个示例说明: 三星2022 Type-C U盘使用评测 1. 性能评测 三星2022 Type-C U盘采用了高速的USB 3.1 Gen 1接口,具备快速的数据传输能力。以下是两个示例说明: 示例说明1:在传输大文件时,三星2022 Type-C U盘能够达到每秒读取速度300MB和写入速度…

    other 2023年10月18日
    00
合作推广
合作推广
分享本页
返回顶部