1,040
社区成员




这是我参加朝闻道知识分享大赛的第三篇文章
目录
字符串在C语言中实际上是一个字符数组,以空字符'\0'
作为结束标志。这种设计使得C语言能够高效地处理字符串,同时也要求我们在使用字符串时格外小心,以避免越界访问等潜在问题。
字符数组方式:
char str[11] = "Hello, World!"; // 数组大小为11,包含末尾的空字符'\0'
这种方式是字符串定义方式,允许我们对字符串进行修改。但需要注意的是,数组的大小必须足够容纳字符串及其结束符'\0'
。
指针方式(只读):
const char *ptr = "Hello, World!";
使用指针方式定义的字符串通常是只读的,因为字符串常量存储在程序的只读数据段中。如果尝试修改这样的字符串,将会导致未定义行为。
C语言标准库提供了一系列用于操作字符串的函数,这些函数定义在<string.h>
头文件中。
长度计算:strlen
函数用于计算字符串的长度(不包括结束符'\0'
)。
char str[] = "Hello, World!";
size_t len = strlen(str); // len = 13
拼接:strcat
函数用于将两个字符串拼接在一起。
char str1[50] = "Hello";
char str2[] = ", World!";
strcat(str1, str2); // str1 = "Hello, World!"
需要注意的是,目标字符串必须有足够的空间来容纳拼接后的结果。
复制:strcpy
函数用于将一个字符串复制到另一个字符串中。
char dest[50];
char src[] = "Copy me!";
strcpy(dest, src); // dest = "Copy me!"
同样,目标字符串必须有足够的空间来容纳源字符串。
比较:strcmp
函数用于比较两个字符串的大小。
char str1[] = "Apple";
char str2[] = "Banana";
int result = strcmp(str1, str2); // result < 0 表示str1小于str2
strcmp
函数按照字符的ASCII码值进行比较,如果第一个不匹配的字符在str1中的ASCII码值小于str2中的ASCII码值,则返回负值;如果大于,则返回正值;如果相等,则继续比较下一个字符,直到找到不匹配的字符或字符串结束。
其他操作:C语言标准库还提供了许多其他字符串操作函数,如strchr
(查找字符)、strstr
(查找子串)、sprintf
(格式化字符串到数组)等。
在C语言中,字符串的输入输出通常使用scanf
和printf
函数。
输入:使用scanf
函数读取字符串时,需要注意缓冲区溢出的问题。由于scanf
使用%s
格式说明符读取字符串时不会检查目标数组的大小,因此很容易发生缓冲区溢出。为了避免这个问题,可以使用%ns
格式说明符来限制读取的字符数(其中n是目标数组的大小减一,以留出空间给结束符'\0'
)。
char str[50];
printf("Enter a string: ");
scanf("%49s", str); // 读取最多49个字符,留出一个字符给'\0'
另外,还可以使用fgets
函数来安全地读取字符串,它会读取直到遇到换行符或达到指定的字符数限制(包括换行符),并将换行符存储在目标数组中(如果空间允许)。
输出:使用printf
函数输出字符串时,只需使用%s
格式说明符即可。
char str[] = "Hello, World!";
printf("%s\n", str);
在C语言中,printf
函数是格式化输出的核心。它允许我们按照指定的格式将不同类型的数据输出到控制台或文件中。接下来,我们将深入探讨printf
函数的格式说明符及其使用技巧。
整数:使用%d
或%i
格式说明符输出整数。
int num = 100;
printf("%d\n", num); // 输出:100
浮点数:使用%f
格式说明符输出浮点数(默认保留6位小数)。
float pi = 3.14159;
printf("%f\n", pi); // 输出:3.141590
可以使用.n
的形式来指定小数点后的位数(n为精度)。
字符:使用%c
格式说明符输出单个字符。
char ch = 'A';
printf("%c\n", ch); // 输出:A
字符串:使用%s
格式说明符输出字符串。
char str[] = "Hello";
printf("%s\n", str); // 输出:Hello
宽度:指定输出字符的最小宽度。如果实际字符数少于指定宽度,则使用空格进行填充。
int num = 10;
printf("%5d\n", num); // 输出: 10 (前面有3个空格)
可以使用-
标志来指定左对齐。
精度:对于浮点数,指定小数点后的位数。
float pi = 3.14159;
printf("%.2f\n", pi); // 输出:3.14
对于整数,精度指定了最小宽度(如果宽度未指定)或最大宽度(如果宽度和精度都指定了)。
-
:左对齐输出。
int num = 10;
printf("%-5d\n", num); // 输出:10 (数字右侧有3个空格)
+
:输出正数时带加号。
int num = 10;
printf("%+d\n", num); // 输出:+10
0
:用0填充宽度(仅当宽度指定时有效)。
int num = 10;
printf("%05d\n", num); // 输出:00010
#
:对于浮点数,强制输出小数点和小数部分(即使为零);对于整数,如果基数不是10,则前缀0x或0X(对于十六进制)或0(对于八进制)。
(空格):对于正数,在数字前加一个空格(仅当+
标志未指定时有效)。
十六进制:使用%x
或%X
格式说明符输出无符号整数的十六进制表示(小写/大写)。
int num = 255;
printf("%x\n", num); // 输出:ff
printf("%X\n", num); // 输出:FF
可以使用#
标志来添加前缀0x
或0X
。
八进制:使用%o
格式说明符输出无符号整数的八进制表示。
int num = 8;
printf("%o\n", num); // 输出:10
同样,可以使用#
标志来添加前缀0
。
%p
格式说明符输出指针的值(通常以十六进制表示)。
int *ptr = #
printf("%p\n", (void *)ptr); // 输出指针的值(注意类型转换)
%%
格式说明符。
printf("Percentage sign: %%\n"); // 输出:Percentage sign: %
5. 宽度与精度的组合使用
在实际应用中,我们经常会将宽度与精度组合使用来精确控制输出的格式。
float pi = 3.14159;
printf("%7