文章目录
- 1.测字符串长度函数
- 2.字符串拷贝函数
- 1.strcpy函数
- 2.strncpy函数
- 3.字符串追加函数
- 1.strcat函数
- 2.strncat函数
- 4.字符串比较函数
- 1.strcmp函数
- 2.strncmp函数
- 5.字符查找函数
- 1.strchr函数
- 2.strrchr函数
- 6.字符串匹配函数
- 7.空间设定函数
- 8.字符串转换数值
- 9.字符串切割函数
- strtok函数练习
#pragma 指令的作用是:用于指定计算机或操作系统特定的编译器功能。
#pragma warning(disable:4996) 在c文件开始处写上这句话,即告诉编译器忽略4996警告,strcpy,scanf等一些不安全的标准c库函数在vs中就可以使用了。
1.测字符串长度函数
- 头文件:#include<string.h>
- 函数定义:size_t strlen(const char* s);
- 函数功能:计算字符指针s指向的字符串中字符的个数,不包括’\0’。
- 返回值:字符串中字符的个数。
#include<stdio.h>
#include<string.h>
//#pragma warning(disable:4996)
int main()
{
char str1[20] = "hello";
char* str2="hello";
printf("sizeof(str1)=%d\n", sizeof(str1));
printf("sizeof(str2)=%d\n", sizeof(str2));
printf("strlen(str1)=%d\n", strlen(str1));
printf("strlen(str2)=%d\n", strlen(str2));
return 0;
}
2.字符串拷贝函数
- 头文件:#include<string.h>
1.strcpy函数
- 函数的声明:char* strcpy(char* dest,const char* src);
- 函数的说明:拷贝src指向的字符串到dest指针指向的内存中,'\0’也会拷贝。
- 函数的返回值:目的内存的地址。
注意:在使用此函数时,必须保证dest指向的内存空间足够大,否则会出现内存污染。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "aaaaaaaaaaaaaaaaaaaaaaaa";
strcpy(str, "hello");
printf("str=%s\n", str);
printf("str+6=%s\n", str+6);
return 0;
}
2.strncpy函数
- char* strncpy(char* dest, const char* src, size_t n);
- 函数说明:将src指向的字符串前n个字节拷贝到dest指向的内存中。
- 返回值:目的内存的首地址。
注意:
- strncpy不拷贝’\0’。
- 如果n大于src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char buf[100] = "aaaaaaaaaaaaaaaaaaaa";
strncpy(buf, "hello", 5);
printf("buf=%s\n", buf);
return 0;
}
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char buf[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaa";
int len,i;
len = strlen(buf);
strncpy(buf, "helloworld", 15);
printf("buf=%s\n", buf);
for (i = 0; i < len; i++)
{
printf("buf[%d]=%c ",i,buf[i]);
if (i % 5 == 0) {
printf("\n");
}
}
return 0;
}
3.字符串追加函数
- 头文件:#include<string.h>
1.strcat函数
- 函数声明:char* strcat(char* dest, const char* src);
- 函数功能:strcat函数追加src字符串到dest指向的字符串后面。追加的时候会追加’\0’。
- 注意:保证dest指向的内存空间足够大。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
strcat(str, "hello");
printf("str=%s\n", str);
return 0;
}
2.strncat函数
- char* strncat(char* dest, const char* src, size_t n);
- 追加src指向的字符串的前n个字符,到dest指向的字符串后面。
- 注意如果n大于src字符的个数,则只将字符串追加到dest指向的字符串后面。追加的时候会追加’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
char* src = "hello";
strncat(str,src,3);
printf("str=%s\n", str);
return 0;
}
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
char* src = "hello";
strncat(str,src,15);
printf("str=%s\n", str);
printf("str+8=%s\n", str + 8);
return 0;
}
4.字符串比较函数
头文件:#include<string.h>
1.strcmp函数
- 函数声明:int strcmp(const char* s1, const char* s2);
- 函数说明:比较s1和s2指向的字符串的大小。逐个字符比较ASCII 码,一旦比较出大小就返回。如果所有字符都一样,则返回0。
- 返回值:如果s1指向的字符大于s2指向的字符,返回1。如果s1指向的字符小于s2指向的字符,返回-1 。如果相等返回0.
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char* str1 = "hello world";
char* str2 = "hello worlda";
int ret;
ret = strcmp(str1, str2);
if (ret > 0)
printf("str1指向的字符串大于str2指向的字符串\n");
else if(ret<0)
printf("str1指向的字符串小于str2指向的字符串\n");
else
printf("两个字符串相等\n");
printf("ret=%d\n", ret);
return 0;
}
2.strncmp函数
- int strncmp(const char* s1,const char* s2, size_t n);
- 函数说明:比较s1和s2指向的字符串中前n个字符。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char* str1 = "hello world";
char* str2 = "hello kitty";
int ret;
ret = strncmp(str1, str2, 5);
if (ret > 0)
printf("str1的前5个字符大于str2的前5个字符\n");
else if(ret < 0)
printf("str1的前5个字符小于str2的前5个字符\n");
else
printf("两个字符串前5个字符相等\n");
}
5.字符查找函数
- 头文件:#include<string.h>
1.strchr函数
- 函数声明:char* strchr(const char* s, int c);
- 函数说明:在字符指针s指向的字符串中,找ASCII码为c的字符。
- 返回值:找到返回字符的地址。找不到返回NULL。
注意:是首次匹配,如果说s指向的字符串中有多个ASCII为c的字符,则找的是第一个字符的返回值。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char* str = "helloworldhelloworldhelloworld";
char* p;
p = strchr(str, 'w');
if (p == NULL)
{
printf("没有您要找的字符");
return 0;
}
printf("p-str=%d\n", p - str);
return 0;
}
2.strrchr函数
- 函数声明:char* strrchr(const char* s,int c);
- 函数说明:末次匹配。在s指向的字符串,找出最后一次出现的ASCII为c的字符。
- 返回值:末次匹配的字符的地址。找不到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char* str = "helloworldhelloworldhelloworld";
char* p;
p = strrchr(str, 'w');
if (p == NULL)
{
printf("没有您要找的字符");
return 0;
}
printf("p-str=%d\n", p - str);
return 0;
}
6.字符串匹配函数
- #include<string.h>
- char* strstr(const char* haystack,const char* needle);
- 函数说明:在haystack指向的字符串中查找needle指向的字符串,也是首次匹配。
- 返回值:找到返回字符串的首地址,没找到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str1[100] = "dfjk$#$adjkwfha$#$dwadaf";
char str2[100] = "$#$";
char* p;
p = strstr(str1, str2);
if (p == NULL)
{
printf("没有您要查找的字符串\n");
return 0;
}
printf("p-str1=%d\n", p - str1);
return 0;
}
7.空间设定函数
头文件:#include<string.h>
- 函数声明:void* memset(void* ptr, int value, size_t num);
- 函数功能:memset函数是将ptr指向的内存空间的num个字节全部赋值为value。
- 参数:ptr:指向任意类型的指针,即指向我们需要修改的内存。value:给ptr指向的内存空间赋的值。num:确定将ptr所指向的内存中的num个字节全部用value代替。
- 返回值:目的内存的首地址,即ptr的值。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "helloworld";
memset(str, '\0', 100);
printf("str=%s\n", str);
memset(str, 'a', 5);
printf("str=%s\n", str);
return 0;
}
8.字符串转换数值
- atoi/atol/atof //字符串转换功能
- 头文件:#include<stdlib.h>
- 函数的声明:int atoi(const char* nptr);
- 函数的功能:将nptr指向的字符串转换成整型返回。
- 返回值:转换后的整数,此值由将输入的字符作为数字解析而成。如果该输入无法转换成该类型的值,则返回值为0。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(diable:4996)
int main()
{
int num;
num = atoi("123");
printf("num=%d\n", num);
num = atoi("abc");
printf("num=%d\n", num);
return 0;
}
long atol(const char* nptr);
double atof(const char* nptr);
9.字符串切割函数
- 头文件:#include<string.h>
- 函数声明:char* strtok(char* str,const char* delim);
- 函数的功能:字符串切割,按照delim指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现了delim字符串中的字符,就将其变成’\0’,调用一次strtok只切割一次,切割一次后,再去切割的时候strtok的第一个参数传NULL,意思是接着上次的切割位置继续切。
注意:如果str字符串中出现了连续几个delim中的字符,则只将第一个字符变成’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
char str[100] = "xiaoming:21,,,.男.女,北京:haidian";
char* p[7];
int i = 0,j;
printf("str=%s\n", str);
p[i] = strtok(str, ":,.");
printf("p[%d]=%s\n", i, p[i]);
printf("str=%s\n", str);
while (p[i] != NULL) {
i++;
p[i] = strtok(NULL, ":,.");
}
for (j = 0; j < i; j++)
{
printf("p[%d]=%s\n", j, p[j]);
}
printf("p[1]+3=%s\n", p[1] + 3);
return 0;
}
strtok函数练习
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int msg_deal(char* msg_src, char* msg_done[], char* str)
{
int i = 0;
msg_done[i] = strtok(msg_src, str);
while (msg_done[i] != NULL)
{
i++;
msg_done[i] = strtok(NULL, str);
}
return i;
}
int main()
{
char s[100] = "+CMGR:REC UNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI";
char* p[6];
int num,i;
num = msg_deal(s, p, ",");
printf("num=%d\n", num);
for (i = 0; i < num; i++)
{
printf("p[%d]=%s\n",i, p[i]);
}
printf("手机号:%s\n", p[1] + 3);
printf("日期:%s\n", p[2]);
*(p[3] + 8) = '\0';
printf("时间:%s\n", p[3]);
printf("内容:%s\n", p[4]);
return 0;
}