从入口参数接过来的数据最好定义个临时变量,做个缓冲,不要轻易修改原地址的值,要引进一个辅助的指针变量把形参接过来,很重要。一定要清楚指针在内存中的指向,不然会指向一个错误的地址。
void get(char *from, char *to)
{
char *myfrom = from;
char *myto = to;
}
strlen是函数,字符串长度,不包括停止符。而sizeof则是内存块的大小,包括停止符。
数组是一种数据类型,数据类型的本质就是固定大小,内存块的别名。可以用sizeof()一般都是数据类型。
int main()
{
char buf[] = "abcd";
printf("%d\n",strlen(buf));
printf("%d\n",sizeof(buf));
}
输出结果就是4,5
看下面的这个程序是错误的,buf是分配在全局区的,是个常量,是只读的,不允许被修改,buf是字符a的首地址。在c++中一般应定义为const类型。
int main()
{
char *buf = "abcd";
buf = buf+1;//error
}
但是你可以这么写:一定要记住buf是个常量,它表示数组首地址。
int main()
{
char *buf = "abcd";
char *p = buf;
p = p+1;//error
}
/************************************
字符串拷贝copy[i] = '\0';丢了,打印的时候不会停止,因为printf是遇到终止符才停止打印。下面是几个经典的字符串拷贝函数。
************************************/如果copy被定义为*copy,程序是无法运行的,因为copy无法分配内存的,程序会卡掉。
int main()
{
char buf[] = "I am a c studer!";
char *copy ;
printf("%p\n",copy);
int i;
for(i = 0; *(buf + i) != '\0';i++)
{
*(copy+i) = *(buf+i);
}
copy[i] = '\0';
printf("%s\n",buf);
printf("%s\n",copy);
}
//(nil)
//Segmentation fault (core dumped)
int main()
{
char buf[] = "I am a c studer!";
char copy[64] ;
int i;
for(i = 0; *(buf + i) != '\0';i++)
{
*(copy+i) = *(buf+i);
}
copy[i] = '\0';
printf("%s\n",buf);
printf("%s\n",copy);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main71()
{
char a[] = "i am a student";
char b[64];
int i = 0;
for (i=0; *(a+i) != '\0'; i++)
{
*(b+i) = *(a+i);
}
b[i] = '\0'; //ÖØÒª
printf("a:%s \n", a);
printf("b:%s \n", b);
system("pause");
return ;
}
void copy_str21(char *from, char *to)
{
for (; *from!='\0'; from++, to++)
{
*to = *from;
}
*to = '\0';
return ;
}
void copy_str22(char *from, char *to)
{
for (; *from!='\0';)
{
*to++ = *from++; // ÏÈ *to = *from; ÔÙfrom++, to++
}
*to = '\0'; //
return ;
}
void copy_str23(char *from, char *to)
{
while( (*to = *from) != '\0' )
{
from ++;
to ++;
}
}
void copy_str24(char *from , char *to)
{
while ( (*to++ = *from++) != '\0')
{
;
}
}
void copy_str25(char *from , char *to)
{
//*(0) = 'a';
while ( (*to++ = *from++) )
{
;
}
}
void copy_str25_err(char *from , char *to)
{
//*(0) = 'a';
while ( (*to++ = *from++) )
{
;
}
printf("from:%s \n", from);
}
int copy_str26_good(char *from , char *to)
{
//*(0) = 'a';
char *tmpfrom = from;
char *tmpto = to;
if ( from == NULL || to == NULL)
{
return -1;
}
while ( *tmpto++ = *tmpfrom++ ) ; //¿ÕÓïŸä
printf("from:%s \n", from);
}
int main111()
{
int ret = 0;
char *from = "abcd";
char buf2[100];
//copy_str21(from, buf2);
//copy_str22(from,buf2);
//copy_str23(from, buf2);
//copy_str24(from, buf2);
//copy_str25(from ,buf2);
//printf("buf2:%s \n", buf2);
system("pause");
return ret;
}
字符串aaaa首先会在全局区分配内存,然后再进行一个到栈区的拷贝工作。
版权声明:本文为qq_39759656原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。