指针和字符串
字符串拼接
c
#include <stdio.h>
void strcat_my(char *a, char *b)
{
while(*a) *a++;
while (*b) *a++ = *b++;
}
int main()
{
char a[100] = "hello";
char b[] = "world";
strcat_my(a, b);
printf("%s ", a);
return 0;
}
去除字符串空格
c
#include <stdio.h>
void remove_space(char *a)
{
char *p = a;
while (*a++)
{
if(*a != ' '){
*p++ = *a;
}
}
}
int main()
{
char a[] = " h e l l o worl d";
remove_space(a);
printf("%s", a);
return 0;
}
查询字符后的字符串
c
#include <stdio.h>
char *findStr(char *a, char b)
{
while (*a)
{
if (*a == b)
return a;
*a++;
}
return NULL;
}
int main()
{
char a[] = "Lhello world";
char *p = findStr(a, 'l');
printf("%s", p);
return 0;
}
字符串模糊匹配
c
#include <stdio.h>
void findStr(char *src, char *dest)
{
char *fsrc = src; // 循环的指针
char *rsrc = src; // 记录匹配的首地址
char *tdest = dest; // 记录目标
while (*fsrc)
{
rsrc = fsrc; // 记录首地址
if (*fsrc == *tdest)
{
while (*tdest)
{
if (*fsrc != *tdest)
{
fsrc = rsrc; // 循环指针回退到记录首地址等待下一次比对
tdest = dest; // 记录目标也重置到开始指针位置
break;
}
*fsrc++;
*tdest++;
}
if (*tdest == 0)
{
// 匹配到
printf("%s\n", rsrc);
}
}
*fsrc++;
}
}
int main()
{
char a[] = "hello world";
findStr(a, "lo");
findStr(a, "ll");
findStr(a, "wo");
return 0;
}
字符串数组
c
#include <stdio.h>
int main()
{
char a[] = "hello world"; // 存在栈区
char* p = "hello world"; // 存在数据区常量区,对应的区域不能修改(不像栈区会有名字来存放)
a[2] = 'e'; // ok
// p[2] = 'f'; // err
// *(p + 2) = 'f'; // err
// 地址是相同的 p1 p2 不能修改
char *p1 = "hello";
char *p2 = "hello";
printf("%p\n", p1);
printf("%p\n", p2);
// 指针数组 字符串可以修改
char s1[] = "hello";
char s2[] = "world";
char *sp1 = { s1, s2};
// 字符串数组,里面的字符串不能修改
char *sp2 = { "hello", "world" };
printf("%s\n", a);
printf("%s\n", p);
return 0;
}
查找字符串出现次数
c
#include <stdio.h>
#include <string.h>
// 查找字符串在目标字符串出现的位置
char *strStr(char *src, char *dest)
{
char *fsrc = src; // 循环的指针
char *rsrc = src; // 记录匹配的首地址
char *tdest = dest; // 记录目标
while (*fsrc)
{
rsrc = fsrc; // 记录首地址
if (*fsrc == *tdest)
{
while (*tdest)
{
if (*fsrc != *tdest)
{
fsrc = rsrc; // 循环指针回退到记录首地址等待下一次比对
tdest = dest; // 记录目标也重置到开始指针位置
break;
}
*fsrc++;
*tdest++;
}
if (*tdest == 0)
{
return rsrc;
}
}
*fsrc++;
}
return NULL;
}
int main(int argc, char *argv[])
{
char str[] = "dhweq ewjkq qwe eeqqwe jk";
char target[] = "jk";
char *n = strStr(str,"123"); // 没有找到时返回 NULL 空指针
char *p = strStr(str,target); // 返回 target 在字符串出现的地址
int count = 0; // 记录 target 在字符串中出现的次数
while(p){
count++;
p += strlen(target); // 加上 target 的字符串长度为下一次查找的起点
p = strStr(p, target); // 从当前起点再一次查找
}
printf("%d", count);
return 0;
}
统计字符出现次数
c
#include <stdio.h>
int main()
{
char str[] = "dhweqdw";
printf("%d-%d\n", 'a', 'z'); // 97-122
printf("%d-%d\n", 'A', 'Z'); // 65-90
int count[100] = {};
int i = 0;
while (str[i])
{
count[str[i] - 'A']++;
i++;
}
i = 0;
while (i < 100)
{
if (count[i])
printf("%c出现%d次\n", i + 'A', count[i]);
i++;
}
return 0;
}
字符串处理函数
strcpy()
c
#include <string.h>
char *strcpy(char *dest, const char *src);
- 功能:把 src 所指向的字符串复制到 dest 所指向的空间中,'\0'也会拷贝过去
- 参数: dest:目的字符串首地址 src:源字符首地址
- 返回值: 成功:返回 dest 字符串的首地址 失败:NULL
注意
如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
c
char dest[20] = "123456789";
char src[] = "hello world";
strcpy(dest, src);
printf("%s\n", dest);
strncpy()
c
#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
- 功能:把 src 指向字符串的前 n 个字符复制到 dest 所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。
- 参数: dest:目的字符串首地址 src:源字符首地址 n:指定需要拷贝字符串个数
- 返回值: 成功:返回 dest 字符串的首地址 失败:NULL
c
char dest[20] ;
char src[] = "hello world";
strncpy(dest, src, 5);
printf("%s\n", dest);
dest[5] = '\0';
printf("%s\n", dest);
strcat()
c
#include <string.h>
char *strcat(char *dest, const char *src);
- 功能:将 src 字符串连接到 dest 的尾部,‘\0’也会追加过去
- 参数: dest:目的字符串首地址 src:源字符首地址
- 返回值: 成功:返回 dest 字符串的首地址 失败:NULL
c
char str[20] = "123";
char *src = "hello world";
printf("%s\n", strcat(str, src));
strncat()
c
#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
- 功能:将 src 字符串前 n 个字符连接到 dest 的尾部,‘\0’也会追加过去
- 参数: dest:目的字符串首地址 src:源字符首地址 n:指定需要追加字符串个数
- 返回值: 成功:返回 dest 字符串的首地址 失败:NULL
c
char str[20] = "123";
char *src = "hello world";
printf("%s\n", strncat(str, src, 5));
strcmp()
c
#include <string.h>
int strcmp(const char *s1, const char *s2);
- 功能:比较 s1 和 s2 的大小,比较的是字符 ASCII 码大小。
- 参数: s1:字符串 1 首地址 s2:字符串 2 首地址
- 返回值: 相等:0 大于:>0 在不同操作系统 strcmp 结果会不同 返回 ASCII 差值 小于:<0
c
char *str1 = "hello world";
char *str2 = "hello mike";
if (strcmp(str1, str2) == 0)
{
printf("str1==str2\n");
}
else if (strcmp(str1, str2) > 0)
{
printf("str1>str2\n");
}
else
{
printf("str1<str2\n");
}
strncmp()
c
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
- 功能:比较 s1 和 s2 前 n 个字符的大小,比较的是字符 ASCII 码大小。
- 参数: s1:字符串 1 首地址 s2:字符串 2 首地址 n:指定比较字符串的数量
- 返回值: 相等:0 大于: > 0 小于: < 0
c
char *str1 = "hello world";
char *str2 = "hello mike";
if (strncmp(str1, str2, 5) == 0)
{
printf("str1==str2\n");
}
else if (strcmp(str1, "hello world") > 0)
{
printf("str1>str2\n");
}
else
{
printf("str1<str2\n");
}
sprintf()
c
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
- 功能:根据参数 format 字符串来转换并格式化数据,然后将结果输出到 str 指定的空间中,直到出现字符串结束符 '\0' 为止。
- 参数: str:字符串首地址 format:字符串格式,用法和 printf()一样
- 返回值: 成功:实际格式化的字符个数 失败: - 1
c
char dst[100] = { 0 };
int a = 10;
char src[] = "hello world";
printf("a = %d, src = %s", a, src);
printf("\n");
int len = sprintf(dst, "a = %d, src = %s", a, src);
printf("dst = \" %s\"\n", dst);
printf("len = %d\n", len);
sscanf()
c
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
- 功能:从 str 指定的字符串读取数据,并根据参数 format 字符串来转换并格式化数据。
- 参数: str:指定的字符串首地址 format:字符串格式,用法和 scanf()一样
- 返回值: 成功:参数数目,成功转换的值的个数 失败: - 1
c
char src[] = "a=10, b=20";
int a;
int b;
sscanf(src, "a=%d, b=%d", &a, &b);
printf("a:%d, b:%d\n", a, b);
strchr()
c
#include <string.h>
char *strchr(const char *s, int c);
- 功能:在字符串 s 中查找字母 c 出现的位置
- 参数: s:字符串首地址 c:匹配字母(字符)
- 返回值: 成功:返回第一次出现的 c 地址 失败:NULL
c
char src[] = "ddda123abcd";
char *p = strchr(src, 'a');
printf("p = %s\n", p);
strstr()
c
#include <string.h>
char *strstr(const char *haystack, const char *needle);
- 功能:在字符串 haystack 中查找字符串 needle 出现的位置
- 参数: haystack:源字符串首地址 needle:匹配字符串首地址
- 返回值: 成功:返回第一次出现的 needle 地址 失败:NULL
c
char src[] = "ddddabcd123abcd333abcd";
char *p = strstr(src, "abcd");
printf("p = %s\n", p);
strtok()
c
#include <string.h>
char *strtok(char *str, const char *delim);
功能:来将字符串分割成一个个片段。当 strtok()在参数 s 的字符串中发现参数 delim 中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
参数: str:指向欲分割的字符串 delim:为分割字符串中包含的所有字符
返回值: 成功:分割后字符串首地址 失败:NULL
在第一次调用时:strtok()必需给予参数 s 字符串
往后的调用则将参数 s 设置成 NULL,每次调用成功则返回指向被分割出片段的指针
c
char a[100] = "adc*fvcv*ebcy*hghbdfg*casdert";
char *s = strtok(a, "*");//将"*"分割的子串取出
while (s != NULL)
{
printf("%s\n", s);
s = strtok(NULL, "*");
}
c
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "123456@qq.com";
char tstr[100];
strcpy(tstr, str);
char *p = strtok(tstr, "@");
printf("%s\n", p);
p = strtok(NULL, ".");
printf("%s\n", p);
p = strtok(NULL, "\0");
printf("%s\n", p);
return 0;
}
atoi()
c
#include <stdlib.h>
int atoi(const char *nptr);
功能:
atoi()
会扫描 nptr 字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。参数: nptr:待转换的字符串
返回值:成功转换后整数
类似的函数有:
atof()
:把一个小数形式的字符串转化为一个浮点数。atol()
:将一个字符串转化为long
类型
c
char str1[] = "-10";
int num1 = atoi(str1);
printf("num1 = %d\n", num1);
char str2[] = "0.123";
double num2 = atof(str2);
printf("num2 = %lf\n", num2);