C++字符数组函数深度剖析

原创 2012年03月31日 15:41:14

1、   连接函数strcat

其函数原型为:strcat(char [ ], const char [ ] );

strcat是string catenate(字符串连接)的缩写。该函数有两个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。第二个自负数组被指定为const,以保证该数组中的内容不会在函数调用期间修改。连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。

例如:

#include<iostream>

usingnamespace std;

 

int main()

{

  char str1[]="People's Republic of";

  char str2[]="China";

  cout<<strcat(str1,str2);

 

};

输出结果为:Perple’s Republic of China

2、   字符串复制函数

其函数原型为:

strcpy ( char[ ] , const char[ ]);

strcpy是string copy(字符串复制)的缩写。它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖。

上例如果调用strcpy(str1,str2);执行后,str2中的五个字符“China”和”\0”,共六个字符都会复制到数组str1中。

说明:a、在调用strcpy函数时,第一个参数必须是数组名(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量。

例如:strcpy(str1,”China”);

b、可以用strcpy函数将一个字符串中前若干个字符复制到字符数组中去。

例如:strcpy(str1,str2,2);

作用是将str2中前面两个字符复制到str1中去,然后再加一个’\0’。

C、只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。

如下非法:

     str1=”China”;     //不能将一个字符串常量赋给一个字符数组

    str1=str2;   //不能将一个字符数组的内容赋给另一个字符数组

str1代表数组地址,是常量,不能被赋值,不能作左值。

 

3、   字符串比较函数:strcmp

函数原型:strcmp( const char [ ], const char[ ]);

strcmp是string compare(字符串比较)的缩写。作用是比较两个字符串。由于这两个字符数组只参加比较而不应改变其内容,因此两个参数都加上const声明。

如下声明合法:

strcmp(str1,str2);

strcmp(“China”,”Korea”);

strcmp(str1,”Beijing”);

比较的结果由函数值带回。

a、    如果str1=str2,函数值为0。

b、   如果str1>str2,函数值为一正整数。

c、    如果str1<str2,函数值为一负整数。

字符串比较的规则与其他语言中的规则相同,记对两个字符串自左至右逐个自负相比(按ASCII码值大小比较),知道出现不同的字符或遇到’\0’为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。

不能用以下形式比较:

  if(str1>str2)

   {

     cout<<"yes";

   }

字符数组名str1str2代表数组地址,上面写法表示将两个数组地址进行比较,而不是对数组中的字符串进行比较。应为:

if(strcmp(str1,str2)>0)

   {

     cout<<"yes";

   }

4、 字符串长度函数strlen

函数原型:strlen(const char [ ]);

strlen是string length(字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括’\0’在内。

例如:char str[10] = “China”;  cout<<strlen(str);

 

 

应用举例:

通过函数调用求三个字符串的最大值:

 可以用一个函数max_string来找出n个字符串中的最大者。在main函数中设一个二维的字符数组str,大小为3*30,即三行30列,每行可以容纳30个字符。可以把str[0],str[1],str[2]看作三个一维字符数组,它们各有30个元素。可以把它们如同一维数组那样进行处理。可以用cin分别读入3个字符串。然后调用max_string函数可以得到最大的字符串,把它放在一维字符数组string中,在函数max_string中输出最大的字符串。程序如下:

 

//============================================================================

// Name        : C++_array.cpp

// Author      : yangbo_hbzjk

// Version     :

// Copyright   : Your copyright notice

// Description : Hello World in C++, Ansi-style

//============================================================================

#include <iostream>

#include <string>

using namespace std;


int main()

{

void max_string(char str[][30],int i);  //函数声明

int i;

char coutry_name[3][30];

for(i=0;i<3;i++)

{

cin>>coutry_name[i];       //输入三个国家名

}

max_string(coutry_name,3);     //调用max_string函数

return 0;

};


void max_string(char str[][30],int n)

{

int i;

char string[30];

strcpy(string ,str[0]);       //使string的值为str[0]的值

for(i=0;i<n;i++)

{

if(strcmp(str[i],string)>0)   //如果str[i]>string

{

strcpy(string,str[i]);    //将str[i]中的字符串复制到string

}

cout<<endl<<"the largest string is:"<<string<<endl;

}

}


【C++深度剖析教程13】函数对象的分析

今天来学习函数对象。什么是函数对象呢?下面我们以一个例子来引出函数对象的概念。 假设我们需要编写一个函数,实现下面这些功能: -函数可以获得斐波那契数列每一项的值 -每调用一次返回一个值 ...
  • qq_37375427
  • qq_37375427
  • 2018年01月21日 21:54
  • 264

【C++深度剖析教程14】经典问题解析三之关于赋值的疑问

今天我们来总结一下,之前所学C++中所遇到的一些经典的问题。 第一个疑问是: -什么时候需要重载赋值操作符 -编译器是否提供默认的赋值操作? 解答: *编译器为每个类默认重载了赋值操作...
  • qq_37375427
  • qq_37375427
  • 2018年01月22日 00:53
  • 297

《C++深度剖析》启程

 小白今年大四,准备毕业,江苏读本科,找工作时发现自己还学之尚浅,现在打算在原有基础上进行深入研究。望各位大佬给予指点。 在大学期间做过双足机器人,15做的微型四旋翼,飞卡,智能插座,和用STM32联...
  • a335366243
  • a335366243
  • 2018年02月07日 22:25
  • 8

《C++深度剖析》学习日志四——函数参数

函数参数的默认值 *C++可以在函数声明时为参数提供一个默认值 *当函数调用是没有提供参数的值,则使用默认值 如:int   mul(int   x   =   0); *参数的默认值必须在函数声明时...
  • a335366243
  • a335366243
  • 2018年02月07日 22:27
  • 21

【C++深度剖析教程16】智能指针的分析

今天我们来学习C++中的一个独有的特性,智能指针。智能指针的作用非常的强大,它解决了C++语言关于指针部分内存泄漏的BUG。那么在此处,内存泄漏指的是什么呢? -动态申请堆空间,用完后不归还 ...
  • qq_37375427
  • qq_37375427
  • 2018年01月23日 00:02
  • 364

从汇编层面深度剖析C++基本对象布局

本文从汇编层面深入分析C++基本对象的内存布局,函数成员,静态函数成员的参数特点。...
  • linyt
  • linyt
  • 2011年05月02日 22:25
  • 4318

《Web安全深度剖析》笔记(一)

第一章。Web安全简介 C段渗透:攻击者通过渗透同一网段内的一台主机对目标主机进行ARP等手段的渗透   第二章深入HTTP请求流求 HTTP请求方法 GET请求时,、若请求资源为动态文本(...
  • yalecaltech
  • yalecaltech
  • 2017年04月07日 23:49
  • 827

品(AngularJS深度剖析与最佳实践)一书的体会

最近在AngularJS中文社区群中群主等三人的书出版了。于是我也抱着跟其他成员一样的思想:‘这可是大神写的书,而且从书的目录也看出这书是值得一看’。在京东买了本,呵呵!在这里说个实话我基本都不买书的...
  • u012138137
  • u012138137
  • 2016年01月27日 15:21
  • 2446

《破坏之王—DDoS攻击与防范深度剖析》

《破坏之王—DDoS攻击与防范深度剖析》 在竞争激烈的互联网领域,总有一些组织和个人利用DDoS攻击进行破坏,从而达成各自的目的。本书为您揭晓互联网上最具破坏力,最难防御的攻击之一——DDo...
  • chengying332
  • chengying332
  • 2015年07月16日 13:19
  • 357

《web安全深度剖析》笔记三

Oracle获取敏感信息: 当前用户权限:select * from session roles 当前数据库版本:select banner from sys.v.$versionwhere ro...
  • yalecaltech
  • yalecaltech
  • 2017年04月28日 18:01
  • 653
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++字符数组函数深度剖析
举报原因:
原因补充:

(最多只允许输入30个字)