一、字符串
- 字符串字面量
字符串字面量也称字符串常量,是由一对双引号括起来的一个字符序列。
- 字符串的储存
- 字符串:由若干有效字符构成且以字符‘\0’作为结束的一个字符序列.(‘\0’不计入字符串的实际长度只计入数组的长度)
- 字符串的初始化
char str[6]={‘H’,‘e’,’l’,’l’,’o’.’\0’};
char str[]={‘H’,‘e’,’l’,’l’,’o’.’\0’};
char str[]={“Hello”};
char str[]=”Hello”;
char*str=”Hello”;
字符串用“”单个字符用‘’
字符串相当于在字符数组后加入‘\0’.
- 字符指针
字符指针是指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的储存空间并有唯一确定的首地址。因此只要将字符串的首地址赋值给字符指针即可让字符指针指向一个字符串。对字符串字面量而言,字符串字面量本身代表的就是存放他的常量储存区的首地址,是一个地址常量。
二、字符串的访问与输入/输出
构造字符串用数组:用数组定义的字符串指向一个非只读区段,它作为本地变量,其空间会被自动回收,方便构造。
处理字符串用指针:由指针定义的字符串,指向只读区,无法再构造,但可以像其他指针一样用于函数中处理参数,以及动态分配空间。
访问字符串中的单个字符
由于字符串相当于在字符数组后加入‘\0’,所以与其他类型数组一样,可以通过下标的方式访问字符数组中的每个字符。
1.数组下标
Char str[]={“Hello”};
Str[0]表示‘H’
Str[i]用以访问第i+1个字符
2.指针
Char str[]={“Hello”};
Int*prt;
prt=str;
*(prt+i)表示第i+1个字符
也可以用过prt++操作,但不能通过str++操作
字符串的输入/输出
1.按c一个一个输入输出
-
for(i=0;i<10;i++)
-
{
-
scanf(“%c”,&str[i]);
-
}
-
for(i=0;i<10;i++)
-
{
-
printf(“%c”,str[i]);
-
}
-
for(i=0;str[i]!=’\0’;i++)
-
{
-
printf(“%c”,str[i]);
-
}
2.按s输出字符串(不能输入带空格的字符串)
scanf(“%s”,str);
printf(“%s”,str);
3.gets()puts()
关于getchar()gets()scanf()
(一)getchar()
1.getchar返回的是字符的ASCⅡ码值(整数)
2.getchar在读取结束或失败时会返回EOF(EOF意思是end of file,本质是-1)
3.getchar()依次在缓冲区里读取字符,一次只读取一个字符。
4.getchar()可以将“\n”冲走
-
#include<stdio.h>
-
Int main(void)
-
{
-
char ch;
-
while((ch=getchar())!=’#’)
-
putchar();
-
return 0;
-
}
(二)scanf()
1.scanf只会读取\n之前的内容,读走后会将\n留在缓冲区
2.以%d,%f读入数值类型会自动跳过多余的空格和换行(会把空格、回车、制表符吃掉)
3.以%c会读入任何字符
4.以%s遇到空格和换行会停止。就是说在输入的字符串中如果有一个空格会被认为字符串结束,空格后的字符将作为下一个输入项处理。
5.scanf是不安全的,因为不知道要读入内容的长度,所以安全的方法是在%与s间插入数字表示最多允许读入的字符的数量
(三)gets()
1.gets()输入一行字符串,中间可以包括空格,以回车结束,并且回车键会被过滤掉,不会留在字符串中
2.gets不能限制字符串长度,容易引起缓冲区溢出
三、字符串函数
#include<string.h>开头
1.gets(字符数组)—输入字符串
2.puts(字符数组)—输出字符串
3.strcat(字符数组1,字符数组2)—将字符串2接到字符中1后用字符数组输出
4.strcpy(字符数组1,字符数组2)—将字符数组2复制到字符数字1中
5. strcmp(字符数组1,字符数组2)—比较大小
以出现第一对不同的字符为准
(1)如果字符串1和字符串2相同,返回0
(2)如果字符串1>字符串2,返回正数
(3)如果字符串1<字符串2,返回负数
strncmp(字符数组1,字符数组2,n)—前n个字符进行比较
返回值与strcmp一致
6.strlen(字符数组)—测量字符串长度(不包括‘\0’)
7.strlwr(字符数组)—转换为小写的函数
8.strupr(字符数组)—转换为大写的函数
四、数值字符串向数值转换
字符串中的每个字符都以ASLⅡ码形式储存在内存单元中,整型数以二进制形式储存
字符 | ‘1’ | ‘2’ | ‘3’ | ‘\0’ |
ASCⅡ码值 | 49 | 50 | 51 | 52 |
二进制值 | 00110001 | 00110010 | 00110011 | 00000000 |
五、const类型限定符
通过采用指针或是数组作为函数参数,可使调用者获得修改后的数据,但有时我们只希望将数据传到被调函数内部,而并不希望他们在函数内被修改,此时,为防止数据被意外修改,也为了函数的功能更明确,可使用const对参数进行限定。
完事后只允许函数访问指针参数指向的地址单元中的内容,不允许修改其内容。
如:unsigned int MyStrlen(const char*str);
当声名一个指针变量是,这个指针变量本身的值以及它所指向的数据都可被声名为const。
如:const数组
const int a[]={1,2,3}
数组名是const类型,数组的每个元素也是const int
(保护数组值)
const位于声名语句中的不同位置,将表示不同含义。
1.const放在类型关键字前。
Int a,b;
const int*p=&a;
*p是只读的,是不可以在程序中被修改的,即不能对*p进行赋值。可以通过修改p指向的变量a进行赋值。
2.const放在类型关键字后*变量名之前/*后变量名之前
int const*p=&a;
本质上更第一种情况一样,第一种用法较为常用。
导入函数的变量是否为const无所谓