c语言中字符型数据在内存中,c语言字符串在内存中是如何存储的
我将为假期做笔记。
这个月可能会发表十几二十篇。
这是目录)关于 \ 0 strlen strcpy strcpy strnccat strrtok strerror memset memcpy memmove memcmpperror对string的理解是什么
什么是字符串‘你好世界’。\n ?这种由双引号引起的字符串称为字符串文字,简称string。C语言中经常处理字符和字符串,但C语言本身没有字符串类型,字符串通常放在常量字符串或字符数组中。
字符串常量适用于不修改它们的字符串函数。
注意:字符串的结束符号是一个转义符\0。\0是计算字符串长度时的结束标记,不作为字符串的内容。
奇妙的事件会发生,没有结束的迹象。
关于 \ 0 \ 0 的知识不属于字符串的内容,而属于字符串的结束分隔符。字的面值是0,占一个字节。
“\ 0”和“0”之间有区别。“0”是字符0,ASCII码值是48。
strlensize _ t strlen(const char * str);斯特伦标准参考
字符串的结尾已经包含“\0”。strlen返回“\0”前的字符数
参数指向的字符串必须以“\0”结尾
注意函数的返回值是size_t,是无符号的,包括计算和无符号(容易出错)。
#包含stdio.h
#包含字符串. h
int main()
{
const char * str1= abcdef
const char * str2= bbb
if(strlen(str2)-strlen(str1) 0)
{
printf( str 2 str 1 \ n );
}
其他
{
printf( Sr t1 str 2 \ n );
}
返回0;
}
//答案是str2 str1,因为计算值也是无符号模拟实现:
strlen的模拟实现,通用计数器方法
size_t my_strlen(char* arr)
{
size _ t count=0;
while (*arr)
{
数数;
arr
}
返回计数;
}
//递归实现
size_t my_strlen(char* arr)
{
如果(!(*arr))
{
返回0;
}
其他
{
返回1 my _ strlen(arr 1);
}
}
//指针减法
size_t my_strlen(char* arr)
{
char * ret=arr
while (*ret)
{
;
}
返回(ret-arr-1);
}
strcpychar * strcpy(char * destination,const char * source);源字符串必须以“\ 0”结尾。
将source指向的C字符串复制到destination指向的数组中,包括终止空字符(并在该点停止)。
将源字符串中的 \ 0 复制到目标空间。目标空间必须足够大,以容纳源字符串。
目标必须是可变的。
模拟实现:
char *my_strcpy(char *dest,const char*src)
{
char * ret=dest
断言(dest src);
while((*dest=*src))
{
;
}
返回ret
}
strcatchar * strcat(char * destination,const char * source);将源字符串的副本追加到目标字符串。destination中的终止空字符被s ource中的第一个字符覆盖,并且在destination中由两者串联而成的新字符串的末尾包含一个空字符。
源字符串必须以“\ 0”结尾。目标空间必须足够大,以容纳源字符串的内容。
目标空间必须是可修改的。
把字符串追加到自己身上怎么样?这是一个无限循环。
模拟实现:
char* my_strcat(char* Dis,char* Sor)
{
char * ret=Dis
断言(dissor);
while (*Dis)
{
Dis
}
while (*Dis=*Sor)
{
;
}
返回ret
}
strcmpint strcmp ( const char * str1,const char * str 2);这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,它将继续处理后面的字符对,直到字符不同或到达终止空字符。
标准代码
模拟实现:
int my_strcmp(const char* arr1,const char* arr2)
{
断言(arr1 arr2)
while (*arr1 *arr2 *arr1==*arr2)
{
arr1
arr2
}
return * arr 1-* arr 2;
}如果第一个字符串大于第二个字符串,将返回一个大于0的数字。如果第一个字符串等于第二个字符串,它将返回0。如果第一个字符串小于第二个字符串,它将返回一个小于0的数字。
strncpychar * strncpy(char * destination,const char * source,size _ t num);将源的前num个字符复制到目标。如果在复制num个字符之前找到了源C字符串的结尾(由空字符表示),则用零填充destination,直到总共写入了num个字符。
将num个字符从源字符串复制到目标空间。
如果源字符串的长度小于num,则在复制源字符串后,将0追加到目标字符串的后面,直到num。
strncatAppends将源到目标的前num个字符作为终止空字符。如果source中c字符串的长度小于num,则只复制到终止空字符为止的内容,也就是说,在字符串1之后添加字符串2的num个字符。
如果n的长度比第二个字符串长,就会追加到\0,所以不会追加。附加的\ 0char * mystrncat (char * dst,constchar * src,size _ t n)将附加在末尾。
{
char * tmp=dst
while (*dst)
{
夏令时;
}
int I;
for(I=0;src[I]in;我)
{
dst[I]=src[I];
}
dst[I]=0;
返回tmp
}
str strchar * str str(const char * str 1,const char * str 2);返回指向str1中第一个str2的指针,如果str2不是str1的一部分,则返回空指针。在字符串1中查找字符串2,并返回字符串1开头的地址。
如果找不到,则返回NULL。
如果str2是空字符串,直接返回str1的第一个地址。
strtokchar * strtok ( char * str,const char * sep);Sep参数是一个字符串,它定义了一组用作分隔符的字符,如 @ . ,即“@”和“.”查找并划分第一个参数以指定一个字符串,该字符串包含0个或多个标记,这些标记由sep字符串中的一个或多个分隔符分隔。strtok函数在str中查找下一个标记,以\0结束,并返回指向该标记的指针。(注意:strtok函数会改变被操作的字符串,所以使用strtok函数拆分的字符串通常是临时复制的内容,可以修改。)strtok函数的第一个参数不为空,函数会在str中找到第一个标记,strtok函数会保存它在字符串中的位置。strtok函数的第一个参数为NULL,函数将从同一字符串中保存的位置开始查找下一个标记。如果字符串中没有更多的标记,则返回空指针int main()。
{
char str[]=-这是一个示例字符串。;
char * pch
printf(将字符串 %s 拆分为标记:\n ,str);
pch=strtok (str,。-);
而(pch!=空)
{
printf (%s\n ,PCH);
pch=strtok (NULL,,-);
}
返回0;
}
strerrorchar * strerror(int errnum);打印错误消息(在这个阶段几乎不需要)
使用
printf(%s\n ,strerror(errno));
//或者直接使用。
佩罗尔(‘福彭’);
memsetvoid *memset( void *dest,int c,size _ t count);Dest是要更改的变量,C是要更改的值,count是要更改的字节数
memcpyvoid * memcpy(void * destination,const void * source,size _ t num);memcpy函数将num字节的数据从源位置反向复制到目标内存位置。当遇到“\ 0”时,此函数不会停止。如果源和目标之间有任何重叠,则复制的结果是未定义的。模拟实现:
void * memcpy ( void * dst,const void * src,size_t count)
{
void * ret=dst
断言(dst src);
while (count - ) {
*(char *)dst=*(char *)src;
dst=(char *)dst 1;
src=(char *)src 1;
}
返回(ret);
}
memvoid * memove(void * destination,constvoid * source,size _ tnum)和memcpy的区别在于,memmove函数处理的源和目标内存块可以重叠。如果源空间和目标空间重叠,您必须使用memmove函数来处理它。模拟实现:
void * memmove ( void * dst,const void * src,size_t count)
{
void * ret=dst
//正面-背面
if (dst src) {
while (count - ) {
*(char *)dst=*(char *)src;
dst=(char *)dst 1;
src=(char *)src 1;
}
}
//后-前
否则{
while (count - ) {
*(*(char *)dst count-1)=*(*(char *)src count-1);
}
}
返回ret
}
memcmpint memcmp ( const void * ptr1,
常量void * ptr2,
size _ t num);比较从ptr1和ptr2指针开始的字节数。
返回值如下所示
Perror将自动在屏幕上为您键入错误消息。
你也可以传给他一个字符串,他会把这个字符串打印在错误信息之前,加在中间。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。