C 语言中的字符串及其操作

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何在 C 编程中创建和操作字符串。你将探索不同的方法来定义字符串,使用 printf 格式化字符串,使用 strlen 确定字符串长度,并使用 strncmp 比较字符串。这些基本的字符串操作对于构建健壮且灵活的 C 应用程序至关重要。

本实验涵盖以下步骤:使用指针表示法定义字符串,使用局部数组表示法定义字符串,使用 printf 格式化字符串,使用 strlen 确定字符串长度,以及使用 strncmp 比较字符串。通过本实验,你将对 C 语言中的字符串操作有扎实的理解,并能够将这些技术应用到自己的项目中。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/operators("Operators") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/strings("Strings") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/operators -.-> lab-438258{{"C 语言中的字符串及其操作"}} c/arrays -.-> lab-438258{{"C 语言中的字符串及其操作"}} c/strings -.-> lab-438258{{"C 语言中的字符串及其操作"}} c/pointers -.-> lab-438258{{"C 语言中的字符串及其操作"}} c/memory_address -.-> lab-438258{{"C 语言中的字符串及其操作"}} c/output -.-> lab-438258{{"C 语言中的字符串及其操作"}} end

使用指针表示法定义字符串

在这一步骤中,你将学习如何在 C 语言中使用指针表示法定义字符串。指针表示法为 C 编程中创建和操作字符串提供了一种灵活的方式。

首先,我们创建一个新文件来演示如何使用指针表示法定义字符串:

cd ~/project
touch string_pointer.c

现在,输入以下代码:

#include <stdio.h>

int main() {
    // 使用指针表示法定义字符串
    char *greeting = "Hello, C Programming!";

    // 打印字符串
    printf("Greeting: %s\n", greeting);

    return 0;
}

编译并运行程序:

gcc string_pointer.c -o string_pointer
./string_pointer

示例输出:

Greeting: Hello, C Programming!

让我们分解代码:

  • char *greeting 声明了一个指向字符(字符串)的指针
  • "Hello, C Programming!" 是一个存储在内存中的字符串字面量
  • 指针 greeting 指向字符串的第一个字符
  • printf() 使用 %s 格式说明符打印整个字符串

你还可以修改指针以指向字符串的不同部分:

#include <stdio.h>

int main() {
    char *greeting = "Hello, C Programming!";

    // 指向字符串的特定部分
    char *partial = greeting + 7;

    printf("Original string: %s\n", greeting);
    printf("Partial string: %s\n", partial);

    return 0;
}

示例输出:

Original string: Hello, C Programming!
Partial string: C Programming!

使用局部数组表示法定义字符串

在这一步骤中,你将学习如何在 C 语言中使用局部数组表示法定义字符串。这种方法提供了另一种创建和初始化字符串的方式,能够更直接地控制字符数组。

让我们创建一个新文件来演示如何使用局部数组表示法定义字符串:

cd ~/project
touch string_array.c

输入以下代码:

#include <stdio.h>

int main() {
    // 使用局部数组表示法定义字符串
    char greeting[30] = "Hello, C Programming!";

    // 打印字符串
    printf("Greeting: %s\n", greeting);

    return 0;
}

编译并运行程序:

gcc string_array.c -o string_array
./string_array

示例输出:

Greeting: Hello, C Programming!

让我们探索局部数组表示法的一些变体:

#include <stdio.h>

int main() {
    // 显式初始化数组
    char name[10] = {'J', 'o', 'h', 'n', '\0'};

    // 部分初始化数组
    char city[20] = "New York";

    // 不指定数组大小
    char message[] = "Welcome to C Programming!";

    printf("Name: %s\n", name);
    printf("City: %s\n", city);
    printf("Message: %s\n", message);

    return 0;
}

示例输出:

Name: John
City: New York
Message: Welcome to C Programming!

关于局部数组表示法的关键点:

  • 你可以显式指定数组大小
  • '\0'(空终止符)对于标记字符串的结尾至关重要
  • 数组可以使用单个字符或字符串字面量进行初始化
  • 当未完全初始化时,剩余元素会被设置为零

使用 printf 格式化字符串

在这一步骤中,你将学习如何使用 printf() 在 C 语言中格式化字符串和各种数据类型。printf() 函数提供了强大的字符串格式化功能。

让我们创建一个新文件来演示字符串格式化:

cd ~/project
touch string_formatting.c

输入以下代码以探索不同的格式化选项:

#include <stdio.h>

int main() {
    // 基本字符串格式化
    char name[] = "Alice";
    int age = 30;
    float height = 5.8;

    // 简单字符串输出
    printf("Name: %s\n", name);

    // 多变量格式化
    printf("Profile: %s is %d years old\n", name, age);

    // 浮点数精度格式化
    printf("Height: %.1f meters\n", height);

    // 宽度和对齐
    printf("Name (right-aligned): %10s\n", name);
    printf("Name (left-aligned):  %-10s\n", name);

    // 混合不同的格式说明符
    printf("Details: %s, %d years, %.1f meters\n", name, age, height);

    return 0;
}

编译并运行程序:

gcc string_formatting.c -o string_formatting
./string_formatting

示例输出:

Name: Alice
Profile: Alice is 30 years old
Height: 5.8 meters
Name (right-aligned):      Alice
Name (left-aligned): Alice
Details: Alice, 30 years, 5.8 meters

常见的格式说明符:

  • %s: 字符串
  • %d: 整数
  • %f: 浮点数
  • %.1f: 保留一位小数的浮点数
  • %10s: 右对齐,宽度为 10 个字符
  • %-10s: 左对齐,宽度为 10 个字符

让我们探索更高级的格式化:

#include <stdio.h>

int main() {
    // 十六进制和八进制表示
    int number = 255;
    printf("Decimal: %d\n", number);
    printf("Hexadecimal: %x\n", number);
    printf("Octal: %o\n", number);

    // 使用零填充
    printf("Padded number: %05d\n", 42);

    return 0;
}

示例输出:

Decimal: 255
Hexadecimal: ff
Octal: 377
Padded number: 00042

使用 strlen 确定字符串长度

在这一步骤中,你将学习如何使用 strlen() 函数来确定 C 语言中字符串的长度。strlen() 函数是 <string.h> 库的一部分,提供了一种简单的方法来计算字符串中的字符数。

让我们创建一个新文件来演示字符串长度的计算:

cd ~/project
touch string_length.c

输入以下代码以探索 strlen()

#include <stdio.h>
#include <string.h>

int main() {
    // 定义不同长度的字符串
    char greeting[] = "Hello, World!";
    char name[] = "Alice";
    char empty[] = "";

    // 计算并打印字符串长度
    printf("Greeting: %s\n", greeting);
    printf("Greeting length: %lu characters\n", strlen(greeting));

    printf("Name: %s\n", name);
    printf("Name length: %lu characters\n", strlen(name));

    printf("Empty string length: %lu characters\n", strlen(empty));

    return 0;
}

编译并运行程序:

gcc string_length.c -o string_length
./string_length

示例输出:

Greeting: Hello, World!
Greeting length: 13 characters
Name: Alice
Name length: 5 characters
Empty string length: 0 characters

让我们探索一个更实际的 strlen() 使用示例:

#include <stdio.h>
#include <string.h>

int main() {
    char input[100];

    printf("Enter a string: ");
    fgets(input, sizeof(input), stdin);

    // 如果存在换行符,则移除
    input[strcspn(input, "\n")] = 0;

    // 计算并打印字符串长度
    size_t length = strlen(input);

    printf("You entered: %s\n", input);
    printf("String length: %lu characters\n", length);

    // 演示基于长度的操作
    if (length > 10) {
        printf("This is a long string!\n");
    } else if (length > 0) {
        printf("This is a short string.\n");
    } else {
        printf("You entered an empty string.\n");
    }

    return 0;
}

关于 strlen() 的关键点:

  • 返回空终止符之前的字符数
  • 不计算空终止符
  • 适用于字符数组和字符串字面量
  • 属于 <string.h> 库,因此需要包含此头文件
  • 返回 size_t 类型(无符号长整型)

使用 strncmp 比较字符串

在这一步骤中,你将学习如何使用 strncmp() 函数在 C 语言中比较字符串。strncmp() 函数允许你比较两个字符串中指定数量的字符。

让我们创建一个新文件来演示字符串比较:

cd ~/project
touch string_compare.c

输入以下代码以探索 strncmp()

#include <stdio.h>
#include <string.h>

int main() {
    // 定义用于比较的字符串
    char str1[] = "Hello, World!";
    char str2[] = "Hello, Everyone!";
    char str3[] = "Hello, World!";

    // 比较整个字符串
    printf("Full string comparison:\n");
    int result1 = strncmp(str1, str2, strlen(str1));
    int result2 = strncmp(str1, str3, strlen(str1));

    printf("str1 vs str2: %d\n", result1);
    printf("str1 vs str3: %d\n", result2);

    // 比较前几个字符
    printf("\nPartial string comparison:\n");
    int result3 = strncmp(str1, str2, 7);
    printf("First 7 characters of str1 vs str2: %d\n", result3);

    return 0;
}

编译并运行程序:

gcc string_compare.c -o string_compare
./string_compare

示例输出:

Full string comparison:
str1 vs str2: -1
str1 vs str3: 0

Partial string comparison:
First 7 characters of str1 vs str2: 0

让我们创建一个更实际的字符串比较示例:

#include <stdio.h>
#include <string.h>

int main() {
    // 密码验证示例
    char stored_password[] = "SecretPass123";
    char input_password[20];

    printf("Enter password: ");
    scanf("%19s", input_password);

    // 比较密码的前 10 个字符
    int comparison = strncmp(stored_password, input_password, 10);

    if (comparison == 0) {
        printf("Access granted!\n");
    } else {
        printf("Access denied!\n");
    }

    return 0;
}

关于 strncmp() 的关键点:

  • 比较指定数量的字符
  • 如果字符串在指定长度内匹配,则返回 0
  • 如果第一个字符串在字典序上小于第二个字符串,则返回负值
  • 如果第一个字符串在字典序上大于第二个字符串,则返回正值
  • 属于 <string.h>
  • 适用于部分字符串比较

理解 strncmp() 的返回值:

  • 0:字符串在指定长度内相等
  • < 0:第一个字符串在第二个字符串之前
  • 0:第一个字符串在第二个字符串之后

总结

在本实验中,你学习了如何在 C 编程中使用指针表示法和局部数组表示法定义字符串。通过指针表示法,你可以使用字符指针灵活地创建和操作字符串。通过局部数组表示法,你可以更直接地控制字符数组。你还学习了如何使用 printf() 格式化字符串,使用 strlen() 确定字符串长度,以及使用 strncmp() 比较字符串。这些字符串操作技术是处理 C 语言中文本数据的基本技能。