目录
[6.strncpy(p, p1, n) 复制指定长度字符串](#6.strncpy(p, p1, n) 复制指定长度字符串)
[7.strncat(p, p1, n) 附加指定长度字符串](#7.strncat(p, p1, n) 附加指定长度字符串)
[9.strncmp(p, p1, n) 比较指定长度字符串](#9.strncmp(p, p1, n) 比较指定长度字符串)
[10.strchr(p, c) 在字符串中查找指定字符](#10.strchr(p, c) 在字符串中查找指定字符)
[11.strstr(p, p1) 查找字符串](#11.strstr(p, p1) 查找字符串)
[12.isalpha() 检查是否为字母字符](#12.isalpha() 检查是否为字母字符)
[13.isupper() 检查是否为大写字母字符](#13.isupper() 检查是否为大写字母字符)
[14.islower() 检查是否为小写字母字符](#14.islower() 检查是否为小写字母字符)
[15.isdigit() 检查是否为数字](#15.isdigit() 检查是否为数字)
前言
总结了常用字符串函数操作和C语言字符串函数的实现
1.字符串逆序输出
(1)不改变输入的字符串
#include <stdio.h>
#include <string.h>
#define N 20
int main(int argc, char *argv[])
{
char arr[N]; // 使用N初始化数组大小
int i, n;
printf("Please input a string:");
fgets(arr, sizeof(arr), stdin); // 更安全的方式获取输入,使用fgets()函数
n = strlen(arr);
for (i = n-1; i >= 0; i--)
putchar(arr[i]);
putchar('\n');
return 0;
}
(2)改变输入的字符串
#include <stdio.h>
#include <string.h>
#define N 20
int main(int argc, char *argv[])
{
char arr[N] = {0};
int i, j, n, ch;
printf("Please input a string:");
fgets(arr, sizeof(arr), stdin); // 使用fgets安全地获取输入,指定最大读取字符数为数组大小
n = strlen(arr);
i = 0;
j = n-1;
while (i < j)
{
ch = arr[i];
arr[i] = arr[j];
arr[j] = ch;
i++;
j--;
}
fputs(arr, stdout); // 使用fputs输出字符串,不会自动添加换行符
return 0;
}
2.求字符串长度的函数strlen
size_t strlen(const char *str);
参数 str 是要计算长度的字符串,返回值是该字符串的长度。
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括'\0'在内
\xhh表示十六进制数代表的符号
\ddd表示8进制的
例:对于以下字符串,strlen(s)的值为:
char s[10]={'A','\0','B','C','\0','D'};
char s[ ]="\t\v\\\0will\n";
char s[ ]="\x69\141\n"; 答案:1 3 3
函数实现思路:
#include <stddef.h> // 为了使用 size_t 类型
size_t strlen(const char *str)
{
size_t length = 0; // 初始化字符串长度为 0
// 循环直到遇到字符串的结尾
while (*str != '\0')
{
length++; // 每遍历一个字符,长度加一
str++; // 指针向后移动到下一个字符
}
return length; // 返回字符串长度
}
3.字符串拷贝函数strcpy
char *strcpy(char *dest, const char *src);
参数 dest
是目标字符串,src
是源字符串。该函数将 src
中的内容复制到 dest
中,并返回 dest
。
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明: 字符数组1必须足够大 ,拷贝时'\0'一同拷贝
函数实现思路
char *strcpy(char *dest, const char *src)
{
char *p = dest; // 保存目标字符串的起始地址
// 将源字符串的每个字符复制到目标字符串中,直到遇到源字符串的结尾
while (*src != '\0')
{
*dest = *src; // 将源字符串的字符复制到目标字符串中
dest++; // 指针移动到下一个目标字符串的位置
src++; // 源字符串的指针也移动到下一个字符
}
*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'
return p; // 返回目标字符串的起始地址
}
4.字符串连接函数strcat
char *strcat(char *dest, const char *src);
参数 dest
是目标字符串,src
是要连接的字符串。该函数将 src
中的内容连接到 dest
的末尾,并返回 dest
。
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明: 字符数组1必须足够大 以容纳原始字符串的内容和新的字符串内容
连接前,两串均以'\0'结束;
连接后,串1的'\0'取消,新串最后加'\0'
函数实现思路:
char *strcat(char *dest, const char *src)
{
char *p = dest; // 保存目标字符串的起始地址
// 移动指针到目标字符串的结尾
while (*dest != '\0')
{
dest++;
}
// 将源字符串的内容复制到目标字符串的末尾
while (*src != '\0')
{
*dest = *src; // 将源字符串的字符复制到目标字符串的末尾
dest++; // 指针移动到下一个目标字符串的位置
src++; // 源字符串的指针也移动到下一个字符
}
*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'
return p; // 返回目标字符串的起始地址
}
5.字符串比较函数strcmp
int strcmp(const char *str1, const char *str2);
参数 str1
和 str2
是要比较的两个字符串。如果两个字符串相等,返回值为 0;如果 str1
按字典顺序小于 str2
,则返回值小于 0;如果 str1
按字典顺序大于 str2
,则返回值大于 0。
格 式:strcmp(字符串1,字符串2)
功 能:比较两个字符串 比较规则:对两串从左向右逐个字符比较
(ASCII码),直到遇到不同字符或'\0'为止
返 值:返回int型整数
a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
函数实现:
int strcmp(const char *str1, const char *str2)
{
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
str1++;
str2++;
}
return (*str1 - *str2); // 返回字符串比较结果
}
6.strncpy(p, p1, n) 复制指定长度字符串
strncpy
函数用于将源字符串的指定长度复制到目标字符串中。如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。char *strncpy(char *dest, const char *src, size_t n);
参数
dest
是目标字符串,src
是源字符串,n
是要复制的字符数。
函数实现:
#include <stddef.h> // 为了使用 size_t 类型
// 将源字符串的内容复制到目标字符串,最多复制 n 个字符
char *strncpy(char *dest, const char *src, size_t n)
{
char *p = dest; // 保存目标字符串的起始地址
// 拷贝源字符串的内容到目标字符串,直到达到指定的字符数或者遇到源字符串的结尾
while (n > 0 && *src != '\0')
{
*dest++ = *src++; // 将源字符串的字符复制到目标字符串中
n--;
}
//如果源字符串的长度小于指定长度,则在复制完源字符串后,目标字符串的剩余空间将用空字符填充。
while (n > 0)
{
*dest++ = '\0';
}
return p; // 返回目标字符串的起始地址
}
7.strncat(p, p1, n) 附加指定长度字符串
strncat
函数用于将源字符串的指定长度附加到目标字符串的末尾。char *strncat(char *dest, const char *src, size_t n);
参数
dest
是目标字符串,src
是源字符串,n
是要附加的字符数。
函数实现:
char *strncat(char *dest, const char *src, size_t n)
{
char *p = dest; // 保存目标字符串的起始地址
// 移动指针到目标字符串的结尾
while (*dest != '\0')
{
dest++;
}
// 将源字符串的内容复制到目标字符串的末尾,最多复制 n 个字符
while (n > 0 && *src != '\0')
{
*dest++ = *src++; // 将源字符串的字符复制到目标字符串的末尾
n--;
}
*dest = '\0'; // 在目标字符串的末尾添加 null 字符 '\0'
return p; // 返回目标字符串的起始地址
}
8.strcasecmp忽略大小写比较字符串
strcasecmp
函数用于比较两个字符串,忽略大小写。其原型为:int strcasecmp(const char *str1, const char *str2);
参数
str1
和str2
是要比较的两个字符串。如果两个字符串相等(不区分大小写),返回值为 0;否则返回非 0 值。
函数实现:
#include <ctype.h> // 为了使用 tolower 函数
int strcasecmp(const char *str1, const char *str2)
{
while (*str1 != '\0' && *str2 != '\0' && tolower(*str1) == tolower(*str2))
{
str1++;
str2++;
}
return (tolower(*str1) - tolower(*str2)); // 返回字符串比较结果
}
9.strncmp(p, p1, n) 比较指定长度字符串
strncmp
函数用于比较两个字符串的前n个字符。其原型为:int strncmp(const char *str1, const char *str2, size_t n);
参数
str1
和str2
是要比较的两个字符串,n
是要比较的字符数。如果两个字符串的前n个字符相等,返回值为 0;否则返回非 0 值。
函数实现:
#include <stddef.h> // 为了使用 size_t 类型
int strncmp(const char *str1, const char *str2, size_t n)
{
while (n > 0 && *str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
str1++;
str2++;
n--;
}
if (n == 0)
{
return 0; // 前 n 个字符相等
}
else
{
return (*str1 - *str2); // 返回字符串比较结果
}
}
10.strchr(p, c) 在字符串中查找指定字符
strchr
函数在字符串中查找指定字符,并返回第一个匹配到的字符的指针。其原型为:char *strchr(const char *str, int c);
参数
str
是要搜索的字符串,c
是要查找的字符。如果找到了指定字符,则返回该字符在字符串中的地址;否则返回 NULL。
函数实现:
char *strchr(const char *str, int c)
{
while (*str != '\0')
{
if (*str == c)
{
return (char *)str; // 返回指定字符在字符串中的位置
}
str++;
}
return NULL; // 没有找到指定字符,返回 NULL
}
11.strstr(p, p1) 查找字符串
strstr
函数在字符串中查找指定子字符串,并返回第一个匹配到的子字符串的指针。其原型为:char *strstr(const char *haystack, const char *needle);
参数
haystack
是要搜索的字符串,needle
是要查找的子字符串。如果找到了指定的子字符串,则返回该子字符串在字符串中的地址;否则返回 NULL。
函数实现:
char *strstr(const char *haystack, const char *needle)
{
while (*haystack != '\0')
{
const char *h = haystack;
const char *n = needle;
// 在 haystack 中查找与 needle 第一个字符匹配的位置
while (*h != '\0' && *n != '\0' && *h == *n)
{
h++;
n++;
}
// 如果找到了 needle,则返回其在 haystack 中的位置
if (*n == '\0')
{
return (char *)haystack;
}
// 否则,继续搜索下一个字符
haystack++;
}
// 如果 haystack 中不存在 needle,则返回 NULL
return NULL;
}
12.isalpha() 检查是否为字母字符
isalpha
函数用于检查一个字符是否为字母字符(即 A-Z 或 a-z)。其原型为:int isalpha(int c);
如果
c
是一个字母字符,则返回非零值(即真);否则返回 0。
函数实现:
int isalpha(int c)
{
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}
13.isupper() 检查是否为大写字母字符
isupper
函数用于检查一个字符是否为大写字母字符(即 A-Z)。其原型为:int isupper(int c);
如果
c
是一个大写字母字符,则返回非零值(即真);否则返回 0。
函数实现:
int isupper(int c)
{
return (c >= 'A' && c <= 'Z');
}
14.islower() 检查是否为小写字母字符
islower
函数用于检查一个字符是否为小写字母字符(即 a-z)。其原型为:int islower(int c);
如果
c
是一个小写字母字符,则返回非零值(即真);否则返回 0。
函数实现:
int islower(int c)
{
return (c >= 'a' && c <= 'z');
}
15.isdigit() 检查是否为数字
isdigit
函数用于检查一个字符是否为数字字符(即 0-9)。其原型为:int isdigit(int c);
如果
c
是一个数字字符,则返回非零值(即真);否则返回 0。
函数实现:
int isdigit(int c)
{
return (c >= '0' && c <= '9');
}