8.C语言字符型数组与字符串操作

程序员成长:技术、职场与思维模式实战指南 10w+人浏览 1.7k人参与

C语言字符型数组与字符串操作

在C语言中,字符型数组主要用于存储字符串,是初学者必须掌握的内容。本文将结合书本知识和实际代码示例,系统讲解字符数组的定义、访问、初始化以及字符串的输入输出、长度获取、复制、拼接和比较。


1. 字符数组的定义与访问

字符数组可以通过 char 关键字定义:

char str[15];        // 定义一个长度为15的字符数组
char str2[50] = "hello, world"; // 初始化字符串

注意:开辟数组空间时,要确保长度足够存储字符串及结尾的 '\0'

访问数组元素可以使用下标运算符 []

char str[15] = "hello";
char ch = str[0];   // 获取第一个字符 'h'
str[1] = 'a';       // 修改第二个字符

下标范围为 0 ~ N-1,可以是常量、变量或表达式。


2. 字符串的初始化方式

char str1[50] = "hello";
char str2[10] = {'b', 'u', 's', '\0'};
char str3[6] = {"hello"};
char str4[10] = {0};
char str5[] = {'h','e','l','l','o','\0'};
char str6[] = "hello6";
char str7[] = {"hello7"};

初始化时,单字符数组必须以 '\0' 结尾,否则字符串操作函数无法正确处理。


3. 字符串的输入与输出

3.1 单个字符输出

putchar(str[0]);      // 输出第一个字符
printf("%c\n", str[0]);

3.2 输出整个字符串

printf("str is %s\n", str);
puts(str);

3.3 字符串输入

char str[50] = {0};
printf("输入名字:");
scanf("%s", str);  // 不支持空格
char str2[50] = {0};
gets(str2);         // 也不支持空格
printf("%s, nihao!", str2);

4. 获取字符串长度

使用库函数

int len = strlen(str);
printf("字符串长度: %d\n", len);

手动计算

int len = 0, i = 0;
while(str[i] != '\0') {
    len++;
    i++;
}
printf("字符串长度: %d\n", len);
char str[10] = "hello";
strlen(str) 计算从 'h' 到 '\0' 之间的字符个数,共5个。
sizeof(str) 计算整个数组占的内存字节数,共10个字节(数组长度 × 每个元素1字节)。
char str[10] = {'h','e','l','\0','l','o'};
strlen 遇到 '\0' 就停止计数,所以只算前3个字符。
sizeof 不管 '\0',仍然是整个数组的字节总数10。

5. 字符串复制

错误示例:

char str1[10] = "aaa";
char str2[10] = "bbb";
str2 = str1;  // 错误!不能直接整体赋值

正确示例:

char str2[50];
strcpy(str2, str1);  // 使用库函数复制

手动实现复制:

int i = 0;
while(str[i] != '\0') {
    str2[i] = str[i];
    i++;
}
str2[i] = '\0';

6. 字符串拼接

手动拼接:

int i = 0, j = 0;
while(str[i] != '\0') i++; // 找到str末尾
while(str2[j] != '\0') {
    str[i++] = str2[j++];
}
str[i] = '\0';

使用库函数:

strcat(str, str2);

注意:目标数组必须足够大,否则会发生越界。


7. 字符串比较

手动比较:

int i = 0, ret = 0;
while(str[i] == str2[i] && str[i] != '\0') {
    i++;
}
ret = str[i] - str2[i];

使用库函数:

int ret = strcmp(str, str2);
if(ret == 0) {
    printf("s1, s2 内容相同\n");
} else {
    printf("s1, s2 内容不同\n");
}

返回值说明:

  • 0:相同
  • 0 或 <0:不同(返回不同字符的 ASCII 差值)


8. 示例代码汇总

字符数组输出示例

#include <stdio.h>
int main() {
    char str[50] = "hello";
    str[0] = 'a';

    for(int i=0; str[i] != '\0'; i++)
        printf("%c\n", str[i]);

    printf("字符串输出: %s\n", str);
    puts(str);
    return 0;
}

字符串复制示例

#include <stdio.h>
#include <string.h>

int main() {
    char src[50] = "hello";
    char dest[50];
    strcpy(dest, src);
    printf("源字符串: %s\n", src);
    printf("目标字符串: %s\n", dest);
    return 0;
}

字符串拼接示例

#include <stdio.h>
#include <string.h>

int main() {
    char str1[100] = "hello";
    char str2[50] = "world";
    strcat(str1, str2);
    printf("拼接结果: %s\n", str1);
    return 0;
}

字符串比较示例

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50] = "hello";
    char str2[50] = "healo";

    int ret = strcmp(str1, str2);
    if(ret == 0)
        printf("字符串相同\n");
    else
        printf("字符串不同\n");

    printf("返回值: %d\n", ret);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值