字符串1

一、字符串的基本概念

字符串的存储结构

在 C 语言中,字符串本质上是 字符数组,并以 空字符 \0 结尾。

存储特点:

  1. 每个字符占一个字节
    • 在 ASCII 编码中,一个字符(如 Aa)占用 1 个字节。
    • 一个字符串的长度是字符个数加 1(空字符 \0)。
  2. 连续存储
    • 字符数组中的每个字符都连续存储在内存中,直到 \0 为止。
  3. 只读字符串
    • 用双引号定义的字符串常量,如 "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'; // 移除换行符

字符串常见错误及防范

  1. 未初始化的字符串

    • 如果定义了字符数组但没有初始化,可能会包含垃圾值。
    char str[10]; // 未初始化
    printf("%s\n", str); // 可能输出随机内容
    
  2. 忘记空字符 \0

    • 手动定义字符串时,忘记加 \0 会导致错误。
    char str[] = {'H', 'e', 'l', 'l', 'o'}; // 缺少 '\0'
    printf("%s\n", str); // 输出可能会超出预期
    
  3. 数组越界访问

    • 超过数组边界的访问会导致不可预知的行为。
    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. 字符串复制:strcpystrncpy

#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. 字符串连接:strcatstrncat

#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. 字符串比较:strcmpstrncmp

#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. 字符串查找:strchrstrstr

#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. 逐步练习: 先熟悉基本操作(输入输出),再学习字符串操作函数。
  2. 重点注意: 字符串数组需要足够的空间,并要防止输入过长。
  3. 实际应用: 多练习一些常见题目,如字符串统计、翻转、查找等。

五、字符串的实际应用

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;
}
posted @ 2024-11-26 18:16  xiaoluosibky  阅读(162)  评论(0)    收藏  举报