引言:
"this is a string"。字符串用双引号包围。
字符数组:
数组的每一个元素都是字符,字符用单引号包围。char c[4] = {'t','h','i','s'};
字符串:
在内存里用字符数组存储字符串,字符数组要加一个元素,以空字符('\0')结尾。
1, 字符串的定义
1.1 字符串概念:C语言中字符串就是存入字符的数组,以‘\0’作为结束标志。
* 用数组存储字符串中的每个字符:字符型数组。
* 用‘\0’作为结束标志。
* 用“%s”输出。
2, 字符数组初始化
2.1 一种复杂的方式:
一个一个字符进行初始化,用字符初始化一个字符数组。例如:char str[11] = {'G','o','o','d',' ','D','a','y','!','\0','e'};
2.2 一种简单的方式,例如
#include <stdio.h>
int main(int argc, const char * argv[])
{
char str[11] = "Good Day!";
char month[] = "January";
printf("%s",month);//month数组实际存储了8个元素,最后一个是“\0”空字符。
return 0;
}
2.3 常量字符串与可变字符串:
常量字符串:通过栈上的常量指针操作访问。
例如:const char *pstr = "Good Day!"; printf("%s",pstr);
字符指针变量表示字符串方式(二)
char *pstr = "Good Day!";//把字符串赋值给字符指针。pstr将指向字符数组中的第一个字符
*可变字符串:定义在栈上的字符数组,里面存储的字符数据可以被修改。
*可以把一个赋值给一个char* 类型指针,但不能通过指针来修改这个字符串。
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
const char *s = "hello";
//常量字符串存储在常量区,指针s当前指向的是一块常量的空间,不能修改这块空间内的值。
strcpy(s,"abcde");//error
char s[6] = "hello";
//常量字符串储存在常量区,这句话声明之后会开辟一块栈空间,把常量字符串的内容写入到栈空间,s本身
//就是变量,所以可以通过s修改他所指向内存的值。
strcpy(s, "abcde");
printf("%s\n",s);
return 0;
}
3. 字符串操作函数
3.1 常用字符串操作函数:strlen(),strcpy(),strcmp(),strcat()。这些函数声明在头文件<string.h>中。
3.2 函数strlen():strlen(length)返回字符串的字符数(长度),不包括'\0';
原型:unsigned long strlen(const char *s);
用法:const char *pstr = "hello";
unsigned long i = strlen(pstr);// i = 5
#include <stdio.h>
#include <string.h>
#include <assert.h>
unsigned long strlen1(char *s)
{
unsigned long sum=0;
assert(s!='\0');
while (*s++ != '\0') {
sum++;
}
return sum;
}
int main()
{
char *a="hello world";
printf("%ld\n",strlen1(a));
return 0;
}
3.3 函数strcpy():
strcpy字符串拷贝函数,from源字符串,to目的字符串。
拷贝一个字符串就是把源字符串内容复制给足够大的有效目的字符串。
原型:char *strcpy(char *to,const char *from);
* to必须指向有效的足够大的可操作的存储空间
* from的内容在内存上占有的存储空间必须小于等于to所指定的存储空间。
自定义实现两字符串拷贝:
#include <stdio.h>
#include <string.h>
#include <assert.h>
char * strcopy(char *dst,const char *src)
{
assert(dst != NULL && src != NULL);
char *ret = dst; //[3]
while ((*dst++=*src++)!='\0');
return ret;
}
int main()
{
char a[4]="he";
char b[90]="HELLO";
printf("%s\n",strcopy(a, b));
return 0;
}
3.4 函数strcmp():
strcmp 字符串比较函数,str1字符串1,str2字符串2。
原型:int strcmp(char * str1,char *str2 );
用法:两个字符串从前往后,逐个比较没对字符的ASCII码的大小;若相同,则继续比较,直到遇到第一对不同的字符。ASCII码整数大的字符为大。
自定义实现两字符比较:
#include <stdio.h>
#include <string.h>
#include <assert.h>
int strcomp(char *str1,const char *str2) //[1]
{
assert(str1!=NULL&&str2!=NULL);
while (*str1&&*str2&&(*str1==*str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char a[4]="he";
char b[90]="HELLO";
printf("%d\n",strcomp(a, b));
return 0;
}