自学内容网 自学内容网

C语言——字符串两种声明初始化方式、输入输出及常见处理函数

C语言中的字符串是一个字符数组,它以空字符(\0作为结束标志。这意味着字符串中的字符是连续存储在内存中的,而字符串的末尾会自动添加一个\0字符来表示字符串的结束。这种表示方式使得C语言在处理字符串时非常灵活,但也要求程序员在创建和修改字符串时小心处理,以避免缓冲区溢出等安全问题。

字符串的声明和初始化

1. 字符数组初始化

当你使用字符数组来定义字符串时,你可以在声明时直接初始化它,或者稍后通过其他方式(如strcpy函数)来填充它。

直接初始化
char str[] = "Hello, World!";

这种方式会在编译时自动将字符串"Hello, World!"(包括结尾的空字符\0)复制到str数组中。数组str的大小将自动根据初始化的字符串长度加上一个空字符(\0来确定,因此在这个例子中,str数组的大小至少是14个字节(13个字符加上一个空字符)。

未初始化

你也可以声明一个字符数组但不立即初始化它,稍后再使用strcpy或类似函数来填充它。

char str[20]; // 声明一个可以存储19个字符加上一个空字符的数组  
strcpy(str, "Hello, World!"); // 使用strcpy函数初始化

注意,在使用strcpy之前,你需要确保目标数组str足够大,以容纳要复制的字符串及其结尾的空字符。

2. 指针指向字符串常量

另一种定义字符串的方式是使用指针指向一个字符串常量。字符串常量本身是一个存储在只读内存区域的字符数组,并且以空字符\0结尾。

const char *ptr = "Hello, World!";

在这个例子中,ptr是一个指向const char的指针,它指向字符串常量"Hello, World!"的首字符。注意这里使用了const关键字,因为字符串常量通常存储在只读内存区域,尝试修改它们会导致未定义行为。 

区别

  • 内存分配和存储:使用字符数组定义的字符串存储在栈上(如果是局部变量)或堆上(如果是动态分配的),而字符串常量存储在只读数据段。
  • 可修改性:字符数组中的字符串是可以修改的,而字符串常量是不可修改的(尽管C语言标准允许不将字符串常量存储在只读内存区域,但大多数现代编译器都会这样做)。
  • 大小自动确定:当使用字符数组并直接初始化它时,数组的大小会自动根据字符串的长度(包括空字符)来确定。而使用指针指向字符串常量时,你不需要(也不能)指定字符串的大小,因为字符串常量的大小是固定的。
  • 性能:在大多数情况下,这两种方式在性能上的差异是微不足道的。然而,如果你在处理大量字符串或需要频繁地复制和修改字符串时,使用字符数组可能会更加高效,因为你可以更直接地控制内存的使用。

字符串的输入输出

输入

C语言标准库中没有直接读取字符串的输入函数,但可以使用scanf函数或fgets函数等。scanf函数在读取字符串时遇到空格、制表符或换行符会停止读取,而fgets函数会读取整行直到遇到换行符或达到指定的字符数限制(包括换行符),并将换行符也存储到字符串中(如果需要,可以手动去除)。

#include <stdio.h>  
  
char str[100];  
printf("Enter a string: ");  
fgets(str, sizeof(str), stdin); // 使用fgets读取一行  
// 如果需要,可以去除字符串末尾的换行符  
str[strcspn(str, "\n")] = 0;
输出

字符串的输出通常使用printf函数:

#include <stdio.h>  
  
char str[] = "Hello, World!";  
printf("%s\n", str); // 输出字符串

字符串处理函数简介

C语言标准库提供了一系列用于字符串处理的函数,这些函数定义在string.h头文件中。常见的字符串处理函数包括:

  • strlen:计算字符串的长度(不包括\0)。
  • strcpy:复制字符串。
  • strcat:连接两个字符串。
  • strcmp:比较两个字符串。
  • strchr:查找字符串中首次出现指定字符的位置。
  • strstr:查找字符串中首次出现指定子串的位置。
  • sprintf:将格式化的数据写入字符串。


原文地址:https://blog.csdn.net/weixin_45720999/article/details/140545425

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!