跳转到内容

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程序至关重要。