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语言中重要的技能,广泛应用于文件处理、数据解析、网络通信等领域。
  • 通过掌握字符串基础和库函数,可以轻松实现复杂的字符串操作,提高开发效率。
相关推荐
胜天半子_王二_王半仙1 小时前
c++源码阅读__smart_ptr__正文阅读
开发语言·c++·开源
Ocean☾1 小时前
C语言-详细讲解-P1217 [USACO1.5] 回文质数 Prime Palindromes
c语言·数据结构·算法
沐泽Mu1 小时前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa1 小时前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
LinuxST1 小时前
27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)
linux·开发语言·stm32·嵌入式硬件
Tony_long74831 小时前
Python学习——猜拳小游戏
开发语言·python·学习
跳动的梦想家h1 小时前
黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)
java·开发语言·redis
ac-er88882 小时前
PHP 二分法查找算法
开发语言·算法·php
流着口水看上帝2 小时前
JavaScript完整原型链
开发语言·javascript·原型模式
guokanglun2 小时前
JavaScript数据类型判断之Object.prototype.toString.call() 的详解
开发语言·javascript·原型模式