一、字符串的基本概念
字符串的存储结构
在 C 语言中,字符串本质上是 字符数组,并以 空字符 \0
结尾。
存储特点:
- 每个字符占一个字节:
- 在 ASCII 编码中,一个字符(如
A
或a
)占用 1 个字节。 - 一个字符串的长度是字符个数加 1(空字符
\0
)。
- 在 ASCII 编码中,一个字符(如
- 连续存储:
- 字符数组中的每个字符都连续存储在内存中,直到
\0
为止。
- 字符数组中的每个字符都连续存储在内存中,直到
- 只读字符串:
- 用双引号定义的字符串常量,如
"Hello"
,通常存储在只读内存中,无法直接修改。
- 用双引号定义的字符串常量,如
示例:定义与初始化字符串
#include <stdio.h>
int main() {
char str1[] = "Hello"; // 自动在末尾添加 '\0'
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式指定 '\0'
printf("str1: %s\n", str1); // 输出 Hello
printf("str2: %s\n", str2); // 输出 Hello
// 错误示例(缺少 '\0' 会导致输出乱码)
char str3[] = {'H', 'e', 'l', 'l', 'o'};
printf("str3: %s\n", str3); // 可能输出 Hello 后接乱码
return 0;
}
二、字符串的输入与输出
示例:字符串输入与输出
#include <stdio.h>
int main() {
char name[50];
// 使用 scanf
printf("请输入你的名字:");
scanf("%s", name); // 以空格或换行符为结束标志
printf("Hello, %s!\n", name);
// 使用 fgets
printf("请输入一句话:");
getchar(); // 清除上次输入的换行符
fgets(name, sizeof(name), stdin); // 输入整行,自动包含换行符
printf("你输入的是:%s", name); // 自动输出换行符
return 0;
}
注意:
fgets
读取的字符串会包含换行符,必要时可以手动去掉:
name[strcspn(name, "\n")] = '\0'; // 移除换行符
字符串常见错误及防范
-
未初始化的字符串:
- 如果定义了字符数组但没有初始化,可能会包含垃圾值。
char str[10]; // 未初始化 printf("%s\n", str); // 可能输出随机内容
-
忘记空字符
\0
:- 手动定义字符串时,忘记加
\0
会导致错误。
char str[] = {'H', 'e', 'l', 'l', 'o'}; // 缺少 '\0' printf("%s\n", str); // 输出可能会超出预期
- 手动定义字符串时,忘记加
-
数组越界访问:
- 超过数组边界的访问会导致不可预知的行为。
char str[5] = "Test"; str[5] = 'X'; // 错误:越界访问
三、字符串操作函数
C 标准库提供了许多操作字符串的函数,以下以具体示例讲解常用的函数。
1. 字符串长度:strlen
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, C!";
size_t len = strlen(str); // 计算长度
printf("字符串 \"%s\" 的长度是:%lu\n", str, len); // 输出 9
return 0;
}
2. 字符串复制:strcpy
和 strncpy
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Source";
char dest[20];
// 使用 strcpy
strcpy(dest, src);
printf("复制结果:%s\n", dest); // 输出 Source
// 使用 strncpy
strncpy(dest, "Example", 3); // 只复制前 3 个字符
dest[3] = '\0'; // 手动添加 '\0'
printf("部分复制结果:%s\n", dest); // 输出 Exa
return 0;
}
3. 字符串连接:strcat
和 strncat
#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "Hello";
char str2[] = ", World!";
// 使用 strcat
strcat(str1, str2); // 拼接字符串
printf("拼接后:%s\n", str1); // 输出 Hello, World!
// 使用 strncat
strncat(str1, " C Programming", 3); // 只拼接前 3 个字符
printf("部分拼接后:%s\n", str1); // 输出 Hello, World! C
return 0;
}
4. 字符串比较:strcmp
和 strncmp
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int cmp = strcmp(str1, str2); // 比较字符串
if (cmp < 0)
printf("\"%s\" 小于 \"%s\"\n", str1, str2);
else if (cmp > 0)
printf("\"%s\" 大于 \"%s\"\n", str1, str2);
else
printf("\"%s\" 等于 \"%s\"\n", str1, str2);
// 使用 strncmp
cmp = strncmp("abcde", "abcfg", 3); // 只比较前 3 个字符
printf("strncmp 比较结果:%d\n", cmp); // 输出 0(前 3 个字符相等)
return 0;
}
5. 字符串查找:strchr
和 strstr
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
// 查找字符
char *pos = strchr(str, 'W');
if (pos)
printf("找到字符 'W',位置:%ld\n", pos - str);
// 查找子串
char *substr = strstr(str, "World");
if (substr)
printf("找到子串 \"World\",起始位置:%ld\n", substr - str);
return 0;
}
四、综合练习
示例 1:统计字符串中的字符个数
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 去掉换行符
str[strcspn(str, "\n")] = '\0';
printf("字符串 \"%s\" 的长度是:%lu\n", str, strlen(str));
return 0;
}
示例 2:字符串逆序
#include <stdio.h>
#include <string.h>
void reverse(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
// 去掉换行符
str[strcspn(str, "\n")] = '\0';
reverse(str);
printf("逆序后的字符串是:%s\n", str);
return 0;
}
总结
- 逐步练习: 先熟悉基本操作(输入输出),再学习字符串操作函数。
- 重点注意: 字符串数组需要足够的空间,并要防止输入过长。
- 实际应用: 多练习一些常见题目,如字符串统计、翻转、查找等。
五、字符串的实际应用
1. 字符串处理
字符串在 文本处理、加密、数据存储 等场景中非常常见。
示例:统计字符串中某个字符出现的次数
#include <stdio.h>
#include <string.h>
int countChar(const char *str, char ch) {
int count = 0;
while (*str) {
if (*str == ch) count++;
str++;
}
return count;
}
int main() {
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
char ch;
printf("请输入要统计的字符:");
scanf(" %c", &ch);
printf("字符 '%c' 出现了 %d 次。\n", ch, countChar(str, ch));
return 0;
}
标签:int,char,str,printf,字符串,include
From: https://www.cnblogs.com/lyx9785/p/18570749