反转字符串,字符数组

2019-11-14 16:26栏目:网络时代
TAG:

strlen() 和 strcpy()函数,strlenstrcpy函数

澳门新葡亰平台游戏,strlen() 和 strcpy()函数的区别,这两个一个是返回一个C风格字符串的长度,一个是对一个C风格字符串的拷贝,两个本来功能上是不同的,此外,他们还有一些细小的区别:strlen("hello")返回的结果是5,是不包含字符串结尾处的‘’,但是strcpy(str1,str2),会拷贝str2中的‘’

在使用strlen()的返回值去为strcpy的第一个参数分配空间的时候一定要注意!

举个例子:

char *str = "hello";
int length = strlen(str);
char char_array[5];
strcpy(char_array,str);
printf("the new string is:%sn",char_array);
cout<<"str's length is: "<<length<<endl;

这样输出的length是5,但是编译器会提示错误,VS2010提示是:

澳门新葡亰平台官网 1

说明字符串数组定义小了,换成大小为6的数组则恢复正常。

 

在此,建议在使用strcpy的时候,目标数组(第一个参数)的大小应该设置为strlen()函数返回值+1 的值,或者建议使用如下的初始化数组方式:

char char_array[sizeof("hello")];
char * char_array_two = new char[strlen(str) + 1];

 

) 和 strcpy()函数,strlenstrcpy函数 strlen() 和 strcpy()函数的区别,这两个一个是返回一个C风格字符串的长度,一个是对一个C风格字符串的...

###字符数组的定义:有一定顺序关系的若干个字符型变量的集合,就是字符数组。可以是一维的,也可以是多维的。字符数组具有普通数组的性质,又有一些特殊的性质;

//通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识

###字符数组的初始化:

/*分析过程:

:和普通数组相同,逐个为数组元素赋值:

  假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度

char ch[4]={'a','b','c',''};

  相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转

:使用字符串常量来赋值:

*/

char ch[10]={"abcdefghjk"};相当于: char ch[10]={'a','b','c','d','e','f','g','h','j','k',''};

/*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*/

注意:用字符串来初始化字符数组,字符串结尾以“”结尾,上面只有10个字母,但字符串隐含了结束标志,相当于11个字母,越界了。

//直接使用字符数组赋值
char* strrev1(const char* str)
{
   const size_t length = strlen(str);//求字符长度
   char *temp = new char[length];//新建一个等长度的字符数组
   strcpy(temp,str);//字符串拷贝
   for (size_t i = 0; i <= length/2; ++i)//对字符数组中的字符反转,循环执行条件为标识小于或等于字符长度一半
   {
      char c = temp[i];
      temp[i] = temp[length - i -1];
      temp[length - i -1] = c;
   }
   return temp;//返回反转后的字符
}

例:

//采用指针操作方式
char* strrev2(const char* str)
{
   char* tmp = new char[strlen(str)]; 
   strcpy(tmp,str); 

#include#澳门新葡亰平台官网,includeint main()

   char* ret = tmp;//用来最后返回数组指针
   char* p = tmp + strlen(str) - 1;
   while (p > tmp)  
   {  
      char t = *tmp;  
      *tmp++ = *p;  
      *p-- = t;
   }
   return ret;
}

{

//与上一函数基本相似,只不过本函数使用是移位操作改变字符指针指向
char* strrev3(const char* str)

   char* tmp = new char[strlen(str) + 1];
   strcpy(tmp,str); 
   char* ret = tmp;
   char* p = tmp + strlen(str) - 1;
   while (p > tmp)  
   {  
      *p ^= *tmp;
      *tmp++ ^= *p;           
      *p-- ^= *tmp;
   } 
   return ret;
}

char ch[10] ={"abcdefghk"};

//节省几步,直接给新建的字符数组赋反转的值,呵呵,简单明了,只不过循环多执行几次
char* strrev4(const char* str)

   char * temp = new char[strlen(str)]; 
   for(int i = 0; i <= strlen(str); i++)
   {
      temp[i] = str[strlen(str) - i -1];
   }
   return temp;
}

printf("%lun",sizeof;

//使用递归进行字符反转,网上看的,不过感觉不好,限制太多

for (int i=0;i<sizeof/sizeof;i++)

//(不能直接反转常量字符串,因为没有定义新的字符数组,而是在原数组上直接进行字符反转,节省空间,提高效率,还要传递字符长度,增加限制,但总归是个思路)
char* strrev5 (char* str,int len)
{
   if (len <= 1)
      return str;
   char t = *str; 
   *str = *(str + len -1); 
   *(str + len -1) = t; 
   return (strrev5(str + 1,len - 2) - 1); 
}

printf("%cn",ch[i]);

 

return 0;

/*如果传递是std::string类型字符串且是const的!!

}

  返回类型为std::string

此时ch[10]中包含了11个字母,所以程序会报错,因为越界溢出,所以在 char[]={“ ”}中只能存放9个字母;

*/

###字符串

std::string strrev6(const std::string str)

在C语言中,严格的讲是没有字符串的,不管是原生的还是构造的数据类型,但是为何在程序员的心里是有字符串这个类型的,首先,我们知道C语言是一个面向过程的一门语言,而基于C语言更高级的语言Ojective-C是面向对象的语言,而在高级语言中有字符串这一类型,所以,在C语言中,程序员可以通过字符数组模拟字符串。字符串指的是以''作为结束字符的一组字符,因此把一个字符串存入数组时,也把“”存入数组,并以此作为该字符串是否结束的标志;

{

注意:字符串变量与一般的字符数组有一定的区别;

  string r ;//定义一个新的字符串变量,用来接收

字符串常见处理函数

  string r;
   for(int i = 0; i < str.length(); ++i)
   {
      r = str[i] + r;//注意顺序
   }
  return r;

1.strlen

}

头文件:string.h

 

函数原型:size_t strlen(const char *s)

/*如果传递是std::string类型字符串,但不是const的!!

功能:求字符串的长度(不含字符串结束标志'')。

  返回类型为std::string,那你将不必再定义一个新的字符串变量

参数:s为字符串

  节省空间,注意:string类型可以直接接受字符串字面值就是啦..

返回值:字符串的长度(不含字符串结束标志'')

*/

strlen 函数测试字符串的实际长度,并将该长度作为函数的值返回。函数参数“字符串”可以使字符串常量,也可以是字符变量,一般形式:int length=strlen;

std::string strrev6(std::string str)

例:

{

#include <stdio.h>

  for(int i = 0; i <= str.length()/2; ++i)
   {
      char c = str[i];
      str[i] = str[str.length() - i -1];
      str[str.length() - i - 1] = c;
     }
   return str;

#include <string.h>

}

int main()

 

{

char ch_1[ ]="abcn";

char ch_2[ ]=" ";

printf("ABC的长度:%dn",strlen;

printf("ch_1的长度:%dn",strlen;

printf("ch_2的长度:%dn",strlen;

return 0;

}

结果:

ABC的长度:3

ch_1的长度:4

ch_2的长度:0

”abcn“长度为4,而非5,‘n’被看成一个字符。” “长度为0,是因为他是空字符串没有有效字符,所以长度为0;

2.strcpy

头文件:string.h

函数原型:char *strcpy(char *dest,const char *sre)

功能:字符串拷贝

参数:src为源串的起始地址,dest为+目标串的起始地址。

返回值:目标串的起始值

strcpy函数用于实现,iangge字符串的拷贝,一般形式:strcpy(字符串1,字符串2)

其中,字符串1必须是字符串变量,而不能是字符串常量。strcpy函数把字符串2的内容完全复制到字符串1中,而不管字符串1中原先存放的是什么,复制后,字符串2保持不变;

例:

#include <stdio.h>

#include <string.h>

int main()

{

char str[10],str2[10];

strcpy(str,"abcdefg"); //将字符串常量拷贝给字符串变量str

strcpy; //再将字符串变量str拷贝到字符串变量str2

printf("str:%sn",str);

printf("str2:%sn",str2);

return 0;

}

注意:由于字符串是字符数组,所以两个字符串复制不通过赋值运算进行。

3.strcat

头文件:string.h

函数原型:char *strcat(cgar *dest,const char *src)

功能:把字符串src链接到字符串dest 后面

参数:src为源串的起始地址,dest为目标串的起始地址

返回值:目标串的起始地址

strcat 函数可以将两个字符串链接起来,形成一个新的字符串。strcat函数的调用形式为:strcat(字符数组1,字符数组2);功能是将字符串2接到字符串1的后面

例:

#include <stdio.h>

#include <string.h>

int main()

{

char s1[50]="Good";

char s2[]="morning";

strcat;//链接字符串

printf("%sn",s1);

return 0;

}

结果:Goodmoring

4.strcmp

头文件:string.h

函数原型:int strcmp(const char *s1,const char *s2)

功能:按照ASCII码顺序比较字符串s1和字符串s2的大小

参数:s1为字符串起始地址,dest为目标串的起始地址

返回值:比较结果

字符串1=字符串2,返回值=0;

字符串2>字符串2,返回值>0;

字符串2<字符串2,返回值<0;

字符串比较可使用strcmp函数,strcmp函数的调用形式为:strcmp(字符串1,字符串2);

如果字符串1和字符串2完全相等,函数返回0;如果字符串1大于字符串2,函数返回一个正整数;

如果字符串1小于字符串2,函数返回一个负整数。

字符串比较的规则是:将两个字符串从左至右逐个字符按照ASCII码进行比较,直到出现不相等的字符或遇到‘’为止。若果所有字符都相等,则这两个字符串相等。如果出现不相等的字符,以第一个不相等字符的比较结果为准。

例:

#include <stdio.h>

#include <string.h>

int main()

{

char s1[100],s2[100];

int i;

scanf("%s%s",s1,s2);

i=strcmp;

if

{

printf("string1==string2");

}

else if

{

printf("string1>string2");

}

else

{

printf("string1>string2");

}

printf;

return 0;

}

5.strstr

strstr 函数收索一个字符串在另一个字符串中的第一次出现。如果匹配s2则返回首次出现s2位置的指针,否则则返回null。调用strstr函数的一般形式:strstr(被收索的字符串1,被收索的字符串search);

如果search为数字,则收索与数字匹配的ASCII码值得字符

注意:该函数对大小写敏感。如需进行大小写不敏感的收索,请使用stristr().

例:

#include <stdio.h>

#include <string.h>

int main()

{

char str[]="I like monkey,you like cat!";

char serch[]="like";

char *s=strstr(str,search);

printf;

return 0;

}

运行结果:Like monkey,you like cat!

6.strchr

收索字符串s中首次出现字符c的位置。返回首次出现c的位置的指针,如果s中不存在c则返回null。

调用strchr的一般形式:strchr(被搜索的字符串s,被搜索的字符串c);

strchr和strchr用法一致,只是strstr是查找字符串,strchr是查找单个字符;

版权声明:本文由澳门新葡亰平台游戏发布于网络时代,转载请注明出处:反转字符串,字符数组