@[TOC]
关于 mem是内存拷贝 str是字符串拷贝? 什么鬼???
memset 初始化数组
void *memset(void *str, int c, size_t n)
参数1:被初始化的对象 参数2:用什么初始化 参数3:从头开始,初始化几个参数2 返回str的指针
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
strcpy(str,"dqx is handsome very much");
puts(str);
memset(str,'x',3);
puts(str);
return(0);
}
输出
dqx is handsome very much
xxx is handsome very much
重要的利用
memset(dest, '\0', sizeof(dest));
我们这样初始化,就不怕不输出停止 每一个都是终止符号
strcat 衔接append
char *strcat(char *dest, const char *src)
把参数2衔接到参数1 返回参数1的地址
strncat 衔接字符串
char *strncat(char *dest, const char *src, size_t n)
把参数2的前n个衔接到参数1 返回参数1的指针
我们衔接的是字符串不是字符….
strchr 暂时没有找到与memchr的区别
char *strchr(const char *str, int c)
查找参数c在参数str的地址,饭后就函数返回 找不到就返回null
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
输出=
符号<.> 之后的字符串是 <.runoob.com>
strcmp比较所有的….
int strcmp(const char *str1, const char *str2)
strncmp 比较前n个
int strncmp(const char *str1, const char *str2, size_t n)
不多说 ...
比较参数1与参数2 直到出现不同的字符或遇 \0 为止。
如果返回值小于 0,则表示 str1 小于 str2。 如果返回值大于 0,则表示 str1 大于 str2。 如果返回值等于 0,则表示 str1 等于 str2。
strcpy 复制
char* strcpy(char*D,char*S);
他会把S源的字符串部分给复制过去,包括了复制
源字符串的‘\0’
于是D地长度变化是字符串长度+1
#include <stdio.h>
#include <string.h>
int main()
{
char S[40]="AAABBB";
char D[100];
char* buff;
buff=strcpy(D, S);
printf("最终的目标字符串: %s\n", buff);
return(0);
}
话不多说
输出
最终的目标字符串: AAABBB
--------------------------------
Process exited after 0.01031 seconds with return value 0
请按任意键继续. . .
strncpy 话不多说
char *strncpy(char *dest, const char *src, size_t n)
它的弊端….就是最后复制过去后他不会给你的末尾添加一个结束标志0
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main()
{
char S[40]="AAABBB";
char D[12];
int i=0;
strncpy(D, S, 6);
for(i=0;i<10;i++)
printf("%d ",D[i]);
return(0);
}
输出
65 65 65 66 66 66 -1 -1 50 0
--------------------------------
Process exited after 0.01039 seconds with return value 0
请按任意键继续. . .
补救的方法有2种
- 用memset把D的所有位置都清空
- 在D的末尾手动写上
'\0'
- 在定义的时候就D[10]={0},那么后面的数据都被初始化为0
memcpy() 任意内容的复制
他复制的内容是一五一十的复制,,不会存在特地的为你的D添加一个\0
,或者说是给你的…
#include <stdio.h>
#include <string.h>
int main()
{
char S[40]="AAABBB";
char D[100]={89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,};
char* buff;
buff=memcpy(D, S,5);
printf("最终的目标字符串: %s\n", buff);
return(0);
}
输出
最终的目标字符串: AAABBYYYYYYYYYYYY
--------------------------------
Process exited after 0.01094 seconds with return value 0
请按任意键继续. . .
如何解决字符串末尾‘\0’
的问题???
复制多少个字节strlen(S)+1
就可以把字符串的0
耶一样的复制进去
strlen 返回字符串长度
size_t strlen(const char *str)
参数是一个要被计算长度的字符串 返回字符串长度 读取长度的时候,遇到结束字符,但不包括空结束字符。就结束读取
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
int len;
strcpy(str, "dqx");
len = strlen(str);
printf("|%s| 的长度是 |%d|\n", str, len);
return(0);
}
@[TOC]
memchr()
void *memchr(const void *str, int c, size_t n)
参数onst void *str 被检索的字符串指针 参数 size_t n 检索多少个字节,从头部来看的话
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "dqx is A good Boy";
const char key = ' ';
char *ret;
ret = (char*)memchr(str, key ,strlen(str));
printf("|%c| 之后的字符串是 - |%s|\n", key, ret);
return(0);
}
输出
| | 之后的字符串是 - | is A good Boy|
memcmp
int memcmp(const void *str1, const void *str2, size_t n)
把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
memcpy(str1, "ABcdEF", 6);
memcpy(str2, "ABCDEF", 6);
ret = memcmp(str1, str2, 5);
if(ret > 0)
{
printf("str2 小于 str1");
}
else if(ret < 0)
{
printf("str1 小于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}