C 语言字符串基础
C语言字符串基础[编辑 | 编辑源代码]
C语言字符串是C语言中用于表示和操作文本数据的基本数据结构。由于C语言本身没有内置的字符串类型,字符串通常以字符数组的形式实现,并以空字符('\0')作为结束标志。理解字符串的基础知识对于编写高效、可靠的C程序至关重要。
字符串的定义与表示[编辑 | 编辑源代码]
在C语言中,字符串可以定义为字符数组或以指针形式表示的字符序列。字符串总是以空字符('\0')结尾,这是C语言识别字符串结束的标准方式。
字符串的声明与初始化[编辑 | 编辑源代码]
字符串可以通过以下几种方式声明和初始化:
1. 字符数组初始化:
char str1[] = "Hello, World!"; // 自动计算长度并添加'\0'
char str2[14] = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\0'}; // 手动初始化
2. 指针初始化:
char *str3 = "Hello, World!"; // 字符串字面量,存储在只读内存区
字符串的长度[编辑 | 编辑源代码]
字符串的长度是指从字符串开始到第一个空字符('\0')之前的字符数量。可以使用标准库函数strlen()
来计算字符串长度:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("Length of '%s' is %zu\n", str, strlen(str));
return 0;
}
输出:
Length of 'Hello' is 5
字符串的输入与输出[编辑 | 编辑源代码]
C语言提供了多种方式输入和输出字符串,包括标准库函数printf()
、scanf()
、gets()
(不安全)、fgets()
和puts()
。
安全输入字符串[编辑 | 编辑源代码]
推荐使用fgets()
替代gets()
,以避免缓冲区溢出:
#include <stdio.h>
int main() {
char name[50];
printf("Enter your name: ");
fgets(name, sizeof(name), stdin); // 安全读取输入
printf("Hello, %s", name);
return 0;
}
输入:
Enter your name: John
输出:
Hello, John
字符串操作函数[编辑 | 编辑源代码]
C标准库(string.h
)提供了丰富的字符串操作函数,以下是常用的几类:
字符串复制[编辑 | 编辑源代码]
使用strcpy()
或更安全的strncpy()
:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Copy me!";
char dest[20];
strcpy(dest, src);
printf("Copied string: %s\n", dest);
return 0;
}
输出:
Copied string: Copy me!
字符串连接[编辑 | 编辑源代码]
使用strcat()
或strncat()
:
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[] = " World!";
strcat(str1, str2);
printf("Concatenated string: %s\n", str1);
return 0;
}
输出:
Concatenated string: Hello World!
字符串比较[编辑 | 编辑源代码]
使用strcmp()
或strncmp()
:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
printf("Comparison result: %d\n", result); // 返回负值表示str1 < str2
return 0;
}
输出:
Comparison result: -1
字符串与内存管理[编辑 | 编辑源代码]
由于C字符串本质上是字符数组,因此在处理动态字符串时需要特别注意内存管理:
动态分配字符串[编辑 | 编辑源代码]
使用malloc()
和free()
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *dynamicStr = malloc(50 * sizeof(char));
if (dynamicStr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
strcpy(dynamicStr, "This is a dynamically allocated string");
printf("%s\n", dynamicStr);
free(dynamicStr); // 必须释放内存
return 0;
}
输出:
This is a dynamically allocated string
实际应用案例[编辑 | 编辑源代码]
以下是一个简单的用户登录系统,展示了字符串的实际应用:
#include <stdio.h>
#include <string.h>
#define MAX_USERNAME_LEN 20
#define MAX_PASSWORD_LEN 20
int main() {
char username[MAX_USERNAME_LEN];
char password[MAX_PASSWORD_LEN];
const char *correctUsername = "admin";
const char *correctPassword = "secret123";
printf("Enter username: ");
fgets(username, MAX_USERNAME_LEN, stdin);
username[strcspn(username, "\n")] = '\0'; // 移除换行符
printf("Enter password: ");
fgets(password, MAX_PASSWORD_LEN, stdin);
password[strcspn(password, "\n")] = '\0';
if (strcmp(username, correctUsername) == 0 && strcmp(password, correctPassword) == 0) {
printf("Login successful!\n");
} else {
printf("Invalid credentials!\n");
}
return 0;
}
输入:
Enter username: admin Enter password: secret123
输出:
Login successful!
常见问题与注意事项[编辑 | 编辑源代码]
1. 缓冲区溢出:总是确保目标字符串有足够的空间存放源字符串及其终止空字符。
2. 字符串长度:使用strlen()
时注意它不计算终止空字符。
3. 字符串字面量:修改字符串字面量(如char *s = "literal";
)会导致未定义行为。
4. 内存泄漏:动态分配的字符串必须在使用后释放。
总结[编辑 | 编辑源代码]
C语言字符串是编程中的基础概念,虽然实现简单但功能强大。通过字符数组和指针的组合,配合标准库函数,可以实现各种字符串操作。理解字符串的内存布局和操作规范对于编写安全、高效的C程序至关重要。