C PRIMER PLUS——第8节:字符串和字符串函数

目录

1. 字符串的定义与表示

2. 获取字符串的两种方式

 3.字符串数组

4. 字符串输入函数 

4.1 gets()(不推荐使用,有缓冲区溢出风险)

4.2 fgets()(推荐使用)

4.3 scanf()

4.4 gets_s()(C11 标准,MSVC 支持)

4.5 s_gets()(自定义安全函数)

5. 字符串输出函数 

5.1 puts()

5.2 fputs()

5.3 printf()

6.   函数

6.1 strlen()

6.2 strcat()

6.3 strcpy()

6.4 strcmp()

6.5 strlwr() 和 strupr()(非标准,部分编译器支持)

7.   字符处理函数

7.1 字符分类函数

7.2 字符转换函数 

7.3综合示例:统计字符串中的字母和数字


1. 字符串的定义与表示

在 C 语言中,字符串是由字符数组表示的,以 ** 空字符\0** 结尾。例如:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式初始化

char message[] = "Hello"; // 自动添加'\0',等价于上面的写法


2. 获取字符串的两种方式

  • 字符数组:预分配内存,长度固定

char name[20]; // 定义长度为20的字符数组

  • 字符指针:指向字符串常量(存储在只读内存区) 
    • 只读常量区特点:①内容不可以修改。②里面定义的字符串是可以复用的。

char *greeting = "Hello"; // 指向字符串常量的指针


 3.字符串数组

  • 二维字符数组:存储多个字符串
char fruits[3][10] = {
    "Apple",
    "Banana",
    "Cherry"
}; // 3个字符串,每个最大长度9(留一个位置给'\0')
  • 指针数组:每个元素是一个字符串指针 
char *colors[] = {
    "Red",
    "Green",
    "Blue"
}; // 更灵活,可指向不同长度的字符串

4. 字符串输入函数 

4.1 gets()不推荐使用,有缓冲区溢出风险)

  • 作用:从标准输入读取一行字符串(直到换行符\n
  • 缺点:不检查输入长度,可能导致缓冲区溢出
  • 示例

char str[10];

gets(str); // 输入超过9个字符会溢出

4.2 fgets()推荐使用

  • 作用:从文件或标准输入读取字符串,指定最大长度
  • 原型fgets(str, size, stdin)
  • 特点:会读取换行符\n,需手动处理
  • 示例

char str[10];

fgets(str, 10, stdin); // 最多读9个字符,留一个给'\0'

4.3 scanf()

  • 作用:格式化输入,遇空格或换行符停止
  • 示例

char name[20];

scanf("%s", name); // 输入"John Doe"时,只读取"John"

4.4 gets_s()(C11 标准,MSVC 支持)

  • 作用:安全版本的gets(),需指定缓冲区大小
  • 示例

char str[10];

gets_s(str, 10); // 安全读取,超出长度会截断

4.5 s_gets()(自定义安全函数)

  • 作用:手动实现安全读取,处理换行符
char *s_gets(char *st, int n) {
    char *ret_val;
    ret_val = fgets(st, n, stdin);
    if (ret_val) {
        char *find = strchr(st, '\n'); // 查找换行符
        if (find) *find = '\0'; // 替换为'\0'
        else while (getchar() != '\n') continue; // 清除多余输入
    }
    return ret_val;
}

5. 字符串输出函数 

5.1 puts()

  • 作用:输出字符串并自动添加换行符
  • 示例

char str[] = "Hello";

puts(str); // 输出"Hello"后换行

5.2 fputs()

  • 作用:输出字符串到文件或标准输出,不添加换行符
  • 示例

char str[] = "Hello";

fputs(str, stdout); // 输出"Hello"

5.3 printf()

  • 作用:格式化输出字符串
  • 示例

char name[] = "Alice";

printf("Hello, %s!\n", name); // 输出"Hello, Alice!"


6. <string.h> 函数

6.1 strlen()

  • 作用:计算字符串长度(不包含\0
  • 示例

char str[] = "Hello";

int len = strlen(str); // len = 5

6.2 strcat()

  • 作用:拼接两个字符串
  • 原型strcat(dest, src)
  • 示例

char dest[20] = "Hello, ";

char src[] = "World!";

strcat(dest, src); // dest = "Hello, World!"

6.3 strcpy()

  • 作用:复制字符串
  • 原型strcpy(dest, src)
  • 示例

char src[] = "Hello";

char dest[10];

strcpy(dest, src); // dest = "Hello"

6.4 strcmp()

  • 作用:比较两个字符串
  • 返回值
    • 0:相等
    • 负数:str1 < str2
    • 正数:str1 > str2
  • 示例

int result = strcmp("apple", "banana"); // result < 0

6.5 strlwr() 和 strupr()(非标准,部分编译器支持)

  • 作用:转换字符串大小写
  • 示例

char str1[] = "Hello";

char str2[] = "Hello";

_strlwr(str1); // str1 = "hello" (如果编译器支持)

_strupr(str2); // str2 = "HELLO" (如果编译器支持)


7. <ctype.h> 字符处理函数

7.1 字符分类函数

7.2 字符转换函数 

7.3综合示例:统计字符串中的字母和数字

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
    char str[100];
    int letters = 0, digits = 0, others = 0;
    printf("Enter a string: ");
    fgets(str, 100, stdin);
    // 处理fgets可能读取的换行符
    str[strcspn(str, "\n")] = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (isalpha(str[i]))
            letters++;
        else if (isdigit(str[i]))
            digits++;
        else
            others++;
    }
    printf("Letters: %d\n", letters);//识别字母数量
    printf("Digits: %d\n", digits);//识别数字数量
    printf("Other characters: %d\n", others);//识别空格或符号数量
    return 0;
}

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    航Hang*

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值