060. 使用指针操作字符串

在C语言中,字符串本质上是一个以空字符('\0')结尾的字符数组。指针是操作字符串的强大工具,通过指针可以高效地访问和修改字符串中的字符。以下是一些常见的使用指针操作字符串的示例,包括字符串的遍历、比较、复制和反转。

1. 字符串的遍历

通过指针可以逐个访问字符串中的每个字符,直到遇到空字符 '\0'

#include <stdio.h>

void traverseString(const char* str) {
    const char* ptr = str; // 指向字符串的指针
    while (*ptr != '\0') { // 遍历直到遇到空字符
        printf("%c", *ptr);
        ptr++;
    }
    printf("\n");
}

int main() {
    char str[] = "Hello, World!";
    printf("遍历字符串: ");
    traverseString(str);
    return 0;
}

2. 字符串的比较

通过指针逐个比较两个字符串的字符,直到遇到不同的字符或空字符。

#include <stdio.h>

int compareStrings(const char* str1, const char* str2) {
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2; // 返回字符的差值
        }
        str1++;
        str2++;
    }
    return *str1 - *str2; // 返回剩余部分的比较结果
}

int main() {
    char str1[] = "apple";
    char str2[] = "app";
    char str3[] = "banana";

    printf("比较 '%s' 和 '%s': %d\n", str1, str2, compareStrings(str1, str2));
    printf("比较 '%s' 和 '%s': %d\n", str1, str3, compareStrings(str1, str3));
    printf("比较 '%s' 和 '%s': %d\n", str2, str3, compareStrings(str2, str3));

    return 0;
}

3. 字符串的复制

通过指针逐个复制源字符串的字符到目标字符串中。

#include <stdio.h>

void copyString(char* dest, const char* src) {
    while (*src != '\0') {
        *dest = *src; // 复制字符
        dest++;
        src++;
    }
    *dest = '\0'; // 添加空字符
}

int main() {
    char str1[] = "Hello, World!";
    char str2[50]; // 确保目标数组足够大

    printf("原始字符串: %s\n", str1);
    copyString(str2, str1);
    printf("复制后的字符串: %s\n", str2);

    return 0;
}

4. 字符串的反转

通过指针交换字符串的首尾字符,实现字符串的反转。

#include <stdio.h>
#include <string.h> // 用于 strlen 函数

void reverseString(char* str) {
    int length = strlen(str); // 获取字符串长度
    char* start = str; // 指向字符串的开头
    char* end = str + length - 1; // 指向字符串的末尾

    while (start < end) {
        char temp = *start;
        *start = *end;
        *end = temp;
        start++;
        end--;
    }
}

int main() {
    char str1[] = "Hello, World!";
    char str2[] = "Programming";

    printf("原始字符串1: %s\n", str1);
    printf("原始字符串2: %s\n", str2);

    reverseString(str1);
    reverseString(str2);

    printf("反转后的字符串1: %s\n", str1);
    printf("反转后的字符串2: %s\n", str2);

    return 0;
}

5. 字符串的查找

通过指针查找字符串中某个字符的位置。

#include <stdio.h>

char* findChar(const char* str, char ch) {
    while (*str != '\0') {
        if (*str == ch) {
            return (char*)str; // 返回字符的位置
        }
        str++;
    }
    return NULL; // 未找到字符
}

int main() {
    char str[] = "Hello, World!";
    char ch = 'o';

    char* result = findChar(str, ch);
    if (result != NULL) {
        printf("字符 '%c' 在字符串中的位置: %ld\n", ch, result - str);
    } else {
        printf("字符 '%c' 未找到\n", ch);
    }

    return 0;
}

示例运行

输入:

无输入

输出:

遍历字符串: Hello, World!
比较 'apple' 和 'app': 1
比较 'apple' 和 'banana': -1
比较 'app' 和 'banana': -1
原始字符串: Hello, World!
复制后的字符串: Hello, World!
原始字符串1: Hello, World!
原始字符串2: Programming
反转后的字符串1: !dlroW ,olleH
反转后的字符串2: gnimmargorP
字符 'o' 在字符串中的位置: 4

注意事项

  1. 指针操作的安全性:在操作字符串时,确保指针不越界,避免访问非法内存。确保目标数组有足够的空间,避免缓冲区溢出。
  2. 空字符的处理:字符串操作通常以空字符 '\0' 作为结束标志,确保在操作过程中正确处理空字符。
  3. 标准库函数的使用:虽然手动实现字符串操作有助于理解原理,但在实际开发中,建议使用标准库函数(如 strcpystrcmpstrcat 等),因为它们经过了优化并更安全。

通过使用指针操作字符串,可以更高效地实现各种字符串处理功能,同时加深对指针和字符串的理解。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)