第7讲字符串
1. 字符数组的定义
用来存放字符数据的数组是一个字符数组,字符数组的一个元素存放一个字符的ASCII 码。字符数组的定义如:
char buf[10]; //定义了一个包含10个元素的字符数组,下标0~9
可以使用sizeof运算符获得字符数组占用的字节数,例如:
cout<<"sizeof(buf)="<< sizeof(buf) <<endl; //数组buf占用10个字节的内存
可以使用字符型指针指向字符型数组,例如:
char *p = buf; //同char *p =&buf[0];
但是需要注意的是,在字符型指针上使用sizeof运算符,并不能得到数组占用的字节数,而是得到指针变量本身占用的字节数,编译成32位程序时指针是4个字节,编译成64位程序时指针是8个字节。例如:
cout<<"sizeof(p)="<< sizeof(p) <<endl; //32位时输出4,64位时输出8
使用下标来访问字符数组的元素,例如:
buf[0] = ’A’; //单引号表示字符常量,实际存储的是’A’的ASCII码65
buf[1] = 66; //66是字符’B’的ASCII码
buf[2] = ’C’;
buf[3] = 0 ; //0是字符串的结束符
cout<<buf<<endl; //输出结果是”ABC”,cout遇到0即认为字符串结束了
C++规定了字符串结束的标志,遇到0就表示字符串到此结束,它前面的字符组成有效的字符串。在程序中往往依靠检测0的位置来判断字符串是否结束,而不是根据数组长度来决定字符创长度。通常将0书写为’\0’,它表示ASCII码的值为0的字符。需要注意反斜杠的存在,如果丢掉反斜杠,将变成字符’0’的ASCII码。以下代码可以帮助我们分清0、’\0’和’0’:char ca = 0; //一个字节全0,二进制为00000000
char cb = '\0'; //一个字节全0,二进制为00000000
char cc = '0'; //字符’0’的的ASCII吗,二进制为00110000
printf("ca=%02X cb=%02X cc=%02X\n",ca,cb,cc); //输出ca=00 cb=00 ca=30
我们看到,0和是’\0’是一样的,都是数值0,而’0’是十六进制数30(十进制为48)。
2. 字符数组的初始化
字符数组可以在定义时进行初始化,可以使用花括号将多个字符括起来,每个字符用英文逗号分隔,例如:
char data[1000] = {‘H’,’E’,’L’,’L’,’O’}; //前5个字符给出初值,其余995个字符填充默认值0 可以使用如下代码验证是否填充了默认值0。
for(int i=0; i<1000; i++) printf("%02X",data[i]); //输出48454C4C4F0000……
初始化时可以省略数组长度,此时系统会根据初始值的个数确定数组长度,例如:char str_a[] = {'C','h','i','n','a'}; //花括号中给出全部字符,编译器不会填充0
cout << sizeof(str_a) <<endl; //输出5,这个字符数组含5个元素
可以使用字符串常量来初始化字符数组,例如:
char str_b[]="China"; //双引号给出字符串常量,字符串结束符是0
cout<<sizeof(str_b)<<endl; //输出6,数组含6个元素,最后一个元素是0
此外我们需要注意字符数组和常量字符串的区别:
char str_c[ ] = ”Happy”; //str_c是一个字符数组,6个字符,最后一个是’\0’
char *str_d = "Happy"; //str_d是一个指向常量字符串的指针
字符数组的元素是可以修改的,而常量字符串是不可修改的。
str_c[0] = ’A’; //可以正确执行
str_d[0] = 'A'; //导致运行出错
新的编译器会提示我们给常量字符串加上const,不加const会出现警告。
char *str_e = "World"; //编译器给出警告(Warning)
const char *str_f = "World"; //指向常量字符串的指针str_f
虽然我们经常将字符数组当做字符串使用,但是C++并不要求字符数组的最后一个字符是’\0’,这样的字符数组不能当做字符串使用,因为无法确定字符串的结束位置。例如:char str_g[] = {‘B’,’e’,’j’,’i’,’n’,’g’}; //6个字符,不含’\0’,不能作为字符串使用
如果一个字符数组中中间的某个元素是’\0’,将这个字符数组当做字符串使用时,将会仅使用第一个0之前的字符。例如:
char str_h[]={’H’,’E’,’L’,’L’,’O’, 0 ,’H’, ’A’,’P’, ’P’,’Y’, ’\0’ ,’W’ ,’O’ ,’R’ ,’L’ ,’D’,’\0’};
cout<< str_h <<endl; //输出HELLO,遇到0停止
cout<< str_h + 6 <<endl;//输出HAPPY,遇到’\0’停止
cout<< str_h + 12 <<endl;//输出WORLD,遇到末尾的’\0’停止
3. 字符指针数组
const char* names[]={"Lisa","John","Tony","Mary","Linda"};
数组有4个元素,每个元素是一个指针(4字节或8字节),每个指针分别指向了一个常量字符串的第一个字符,每个常量字符串以’\0’结尾。
命令行参数
命令行参数就是在命令行环境下执行程序时给程序提供的参数。在命令提示符下执行程序打开命令提示符,将路径调到生成的exe文件所在的文件夹,在命令行中输入你的exe文件的名称(如),接着输入空格,再输入参数,参数间用空格隔开,如:D:\project1\Debug>test a b c
此例对应main函数的argc=4 argv[0]=”test” argv[1]=”a” argv[2]=”b” argv[3]=”c”
/* triangle.cpp 命令行参数*/
#include<iostream>
#include<stdlib.h>
using namespace std;
void PrintTriangle(int n);
int main(int argc,char* argv[]){
//argc是命令行参数的个数
//argv是命令行参数 argv[0] argv[1]
// 10 打印10行三角形
if(argc!=2){
cout<<"用法: 行数"<<endl;
return 0;
}
int n = atoi(argv[1]);
if(0==n){
cout<<"输入的行数无效!行数:"<<argv[1]<<endl;
return 0;
}
PrintTriangle(n);
return 0;
}
void PrintTriangle(int n){
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++) cout<<" ";
for(int j=0;j<2*i+1;j++) cout<<"#";
cout<<endl;
}
}
常用DOS命令:
D: 将当前盘符切换到D盘
CD dir1 进入目录dir1
CD .. 回到上一级目录
DIR 查看当前目录下的内容
4. 字符串函数
这里挑选的都是最常用的字符串函数。英文描述来自微软的MSDN文档。
msdn.microsoft/zh-cn/library/hh875057.aspx
strcpy字符串的复制函数
char *strcpy(char *strDestination, const char *strSource );
The strcpy function copies strSource, including the terminating null character (’\0’), to the location that's specified by strDestination. The behavior of strcpy is undefined if the source and destination strings overlap. The strcpy function returns the destination string (strDestination).
实现的核心代码只有一行,如下:
while((*des++ = *source++)!='\0');
strcat 字符串连接函数
char *strcat(char *strDestination, const char *strSource );
The strcat function appends strSource to strDestination and terminates the resulting string with a
null character. The initial character of strSource overwrites the terminating null character of strDestination. The behavior of strcat is undefined if the source and destination strings overlap. The strcat function returns the destination string (strDestination).
strlen 字符串长度函数
size_t strlen(const char *str);
The strlen function returns the number of characters in str, excluding the terminal NULL.
strcmp字符串比较函数
int strcmp( const char *string1, const char *string2 );
string1 and string2 are null-terminated strings to compare.
atoi 字符串转换到int 整型
int atoi( const char *str );
#include <stdlib.h>
The atoi function converts a character string to an integer value. The input string is a sequence of characters that can be interpreted as a numerical value of the specified type. The function stops reading the input string at the first character that it cannot recognize as part of a number. This character may be the null character ('\0') terminating the string.
In the case of overflow with large negative integral values, LONG_MIN is returned. atoi returns INT_M
AX and INT_MIN on these conditions. In all out-of-range cases, errno is set to ERANGE. If the parameter passed in is NULL, the invalid parameter handler is invoked. If execution is allowed to continue, these functions set errno to EINVAL and return 0.
atof 字符串转换到double 浮点数
double atof( const char *str );
The atof function convert a character string to a double-precision, floating-point value.
The function returns the double value produced by interpreting the input characters as a number. The return value is 0.0 if the input cannot be converted to a value of that type.
In all out-of-range cases, errno is set to ERANGE. If the parameter passed in is NULL, the invalid parameter handler is invoked,. If execution is allowed to continue, these functions set errno to EINVAL and return 0.
strcmp可以比较单个字符吗atol 字符串转换到long 整型
long atol( const char *str );
The atol function returns the long value produced by interpreting the input characters as a number. The return value is 0L for atol if the input cannot be converted to a value of that type.
In the case of overflow with large positive integral values, atol returns LONG_MAX; in the case of overflow with large negative integral values, LONG_MIN is returned. In all out-of-range cases, errno is set to ERANGE. If the parameter passed in is NULL, the invalid parameter handler is invoked. If execution is allowed to continue, these functions set errno to EINVAL and return 0.
isalpha() 检查是否为字母字符
int isalpha( int c );
#include <ctype.h>
Determines whether an integer represents an alphabetic character.
The isalpha routine returns nonzero if c is a particular representation of an alphabetic character. isalpha returns a nonzero value if c is within the ranges A – Z or a – z.
isupper() 检查是否为大写字母字符
int isupper( int c );
Determines whether an integer represents an uppercase character.
The isupper routine returns nonzero if c is a particular representation of an uppercase letter. isupper returns a nonzero value if c is an uppercase character (A – Z).
islower() 检查是否为小写字母字符
int islower( int c );
Determines whether an integer represents a lowercase character.
The islower routine returns nonzero if c is a particular representation of a lowercase letter. islower returns a nonzero value if c is a lowercase character (a – z).
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论