C语言:字符串

在C语言中,字符串是一个字符数组,以 空字符(\0) 结尾表示字符串的结束。这种实现方式使得C语言的字符串简单且灵活,但也容易因为操作不当而导致错误(如数组越界、未正确添加空字符等)。

1. 字符串的定义

  • 字符数组方式

定义字符串时,可以使用字符数组。

必须确保数组的最后一个元素是\0,否则字符串未正确结束。

c 复制代码
char str[10] = "hello";  // 自动加上 \0
  • 指针方式

使用字符指针指向一个以\0结束的字符序列。

例如:

c 复制代码
char *str = "hello";

注意:使用这种方式定义的字符串是只读的,修改会引发未定义行为。

2. 字符串的输入与输出

  • 输入字符串

可以使用 scanf,但它在读取字符串时以空格作为分隔符,仅能读取单词。

c 复制代码
char name[50];
scanf("%s", name);

要读取带空格的整行字符串,可使用 gets(已废弃)或 fgets。

c 复制代码
fgets(name, sizeof(name), stdin);
  • 输出字符串

使用 printf 输出字符串:

c 复制代码
printf("%s", name);

3. 字符串的基本操作

C语言没有内置的字符串类型,因此需要依赖 <string.h> 提供的函数来操作字符串:

  • 求字符串长度:strlen

计算字符串长度(不包含\0)。

c 复制代码
#include <string.h>
int len = strlen("hello"); // len = 5
  • 字符串复制:strcpy 和 strncpy

strcpy 将一个字符串复制到另一个字符串。

strncpy 可以指定最大复制长度。

c 复制代码
char str1[10], str2[] = "world";
strcpy(str1, str2); // str1 = "world"
  • 字符串连接:strcat 和 strncat

strcat 将一个字符串附加到另一个字符串末尾。

strncat 限制附加长度。

c 复制代码
char str1[20] = "hello ", str2[] = "world";
strcat(str1, str2); // str1 = "hello world"
  • 字符串比较:strcmp 和 strncmp

比较两个字符串是否相等。

返回值:0 表示相等,正值或负值表示大小关系。

c 复制代码
int result = strcmp("abc", "abd"); // result < 0
  • 字符串查找:strchr 和 strstr

查找字符或子字符串在字符串中的首次出现。

c 复制代码
char *pos = strchr("hello", 'e'); // pos 指向 'e'
char *substr = strstr("hello world", "world"); // substr 指向 "world"

4. 常见字符串操作中的问题

  • 数组越界

未预留足够空间存储字符串和\0。

如:

c 复制代码
char str[5];
strcpy(str, "hello"); // 错误,str 空间不足
  • 忘记加\0

手动操作字符串时,必须在末尾加上\0,否则字符串未定义。

  • 指针操作的风险

如果用字符指针直接指向字符串常量,修改内容会导致错误。

c 复制代码
char *str = "hello";
str[0] = 'H'; // 错误:只读字符串

5. 案例:实现字符串反转功能

以下展示一个完整的字符串反转程序:

c 复制代码
#include <stdio.h>
#include <string.h>
#include <windows.h>

// 函数声明
void reverseString(char str[]);

int main() {
    char str[100];
	SetConsoleOutputCP(65001);
    printf("请输入一个字符串:");
    fgets(str, sizeof(str), stdin);

    // 移除 fgets 捕获的换行符
    size_t len = strlen(str);
    if (len > 0 && str[len - 1] == '\n') {
        str[len - 1] = '\0';
    }

    printf("原字符串:%s\n", str);
    reverseString(str);
    printf("反转后字符串:%s\n", str);

    return 0;
}

// 字符串反转函数
void reverseString(char str[]) {
    int i, j;
    char temp;
    int len = strlen(str);

    for (i = 0, j = len - 1; i < j; i++, j--) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}
  • 运行示例

6. 总结

  • C语言字符串本质是字符数组,需特别注意内存管理。
  • 操作字符串时尽量使用库函数,如strcpy、strlen等,避免手动管理带来的错误。
  • 字符串处理是C语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
  • 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。
相关推荐
wjs20241 小时前
SQL AND & OR 操作符详解
开发语言
~光~~1 小时前
【环境配置 】WSL2 +ubuntu20.04 +Qt配置+Kits配置
开发语言·qt·ubuntu
·心猿意码·2 小时前
C++右值语义解析
开发语言·c++
小龙报2 小时前
《彻底理解C语言指针全攻略(2)》
c语言·开发语言·c++·visualstudio·github·学习方法
zzzsde2 小时前
【c++】深入理解string类(4)
开发语言·c++
郝学胜-神的一滴3 小时前
Effective Python 第44条:用纯属性与修饰器取代旧式的 setter 与 getter 方法
开发语言·python·程序人生·软件工程
迎風吹頭髮4 小时前
UNIX下C语言编程与实践60-UNIX TCP 套接字关闭:close 与 shutdown 函数的区别与使用场景
c语言·网络·unix
程序员莫小特4 小时前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通
white-persist5 小时前
XXE 注入漏洞全解析:从原理到实战
开发语言·前端·网络·安全·web安全·网络安全·信息可视化
人生导师yxc6 小时前
Java中Mock的写法
java·开发语言