C语言字符型数组与字符串操作
在C语言中,字符型数组主要用于存储字符串,是初学者必须掌握的内容。本文将结合书本知识和实际代码示例,系统讲解字符数组的定义、访问、初始化以及字符串的输入输出、长度获取、复制、拼接和比较。
1. 字符数组的定义与访问
字符数组可以通过 char 关键字定义:
char str[15]; // 定义一个长度为15的字符数组
char str2[50] = "hello, world"; // 初始化字符串
注意:开辟数组空间时,要确保长度足够存储字符串及结尾的
'\0'。
访问数组元素可以使用下标运算符 []:
char str[15] = "hello";
char ch = str[0]; // 获取第一个字符 'h'
str[1] = 'a'; // 修改第二个字符
下标范围为 0 ~ N-1,可以是常量、变量或表达式。
2. 字符串的初始化方式
char str1[50] = "hello";
char str2[10] = {'b', 'u', 's', '\0'};
char str3[6] = {"hello"};
char str4[10] = {0};
char str5[] = {'h','e','l','l','o','\0'};
char str6[] = "hello6";
char str7[] = {"hello7"};
初始化时,单字符数组必须以
'\0'结尾,否则字符串操作函数无法正确处理。
3. 字符串的输入与输出
3.1 单个字符输出
putchar(str[0]); // 输出第一个字符
printf("%c\n", str[0]);
3.2 输出整个字符串
printf("str is %s\n", str);
puts(str);
3.3 字符串输入
char str[50] = {0};
printf("输入名字:");
scanf("%s", str); // 不支持空格
char str2[50] = {0};
gets(str2); // 也不支持空格
printf("%s, nihao!", str2);
4. 获取字符串长度
使用库函数
int len = strlen(str);
printf("字符串长度: %d\n", len);
手动计算
int len = 0, i = 0;
while(str[i] != '\0') {
len++;
i++;
}
printf("字符串长度: %d\n", len);
char str[10] = "hello";
strlen(str) 计算从 'h' 到 '\0' 之间的字符个数,共5个。
sizeof(str) 计算整个数组占的内存字节数,共10个字节(数组长度 × 每个元素1字节)。
char str[10] = {'h','e','l','\0','l','o'};
strlen 遇到 '\0' 就停止计数,所以只算前3个字符。
sizeof 不管 '\0',仍然是整个数组的字节总数10。
5. 字符串复制
错误示例:
char str1[10] = "aaa";
char str2[10] = "bbb";
str2 = str1; // 错误!不能直接整体赋值
正确示例:
char str2[50];
strcpy(str2, str1); // 使用库函数复制
手动实现复制:
int i = 0;
while(str[i] != '\0') {
str2[i] = str[i];
i++;
}
str2[i] = '\0';
6. 字符串拼接
手动拼接:
int i = 0, j = 0;
while(str[i] != '\0') i++; // 找到str末尾
while(str2[j] != '\0') {
str[i++] = str2[j++];
}
str[i] = '\0';
使用库函数:
strcat(str, str2);
注意:目标数组必须足够大,否则会发生越界。
7. 字符串比较
手动比较:
int i = 0, ret = 0;
while(str[i] == str2[i] && str[i] != '\0') {
i++;
}
ret = str[i] - str2[i];
使用库函数:
int ret = strcmp(str, str2);
if(ret == 0) {
printf("s1, s2 内容相同\n");
} else {
printf("s1, s2 内容不同\n");
}
返回值说明:
- 0:相同
0 或 <0:不同(返回不同字符的 ASCII 差值)
8. 示例代码汇总
字符数组输出示例
#include <stdio.h>
int main() {
char str[50] = "hello";
str[0] = 'a';
for(int i=0; str[i] != '\0'; i++)
printf("%c\n", str[i]);
printf("字符串输出: %s\n", str);
puts(str);
return 0;
}
字符串复制示例
#include <stdio.h>
#include <string.h>
int main() {
char src[50] = "hello";
char dest[50];
strcpy(dest, src);
printf("源字符串: %s\n", src);
printf("目标字符串: %s\n", dest);
return 0;
}
字符串拼接示例
#include <stdio.h>
#include <string.h>
int main() {
char str1[100] = "hello";
char str2[50] = "world";
strcat(str1, str2);
printf("拼接结果: %s\n", str1);
return 0;
}
字符串比较示例
#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "hello";
char str2[50] = "healo";
int ret = strcmp(str1, str2);
if(ret == 0)
printf("字符串相同\n");
else
printf("字符串不同\n");
printf("返回值: %d\n", ret);
return 0;
}
2521

被折叠的 条评论
为什么被折叠?



