字符
什么是字符
字符就是符号、图案,在计算机中以整数形式存储,当需要显示时会根据ASCII表中的对应关系,显示相应的符号或图案。
字符类型(char)的数据(如字符A,a,0,$等)在内存中以对应的ASCII码存放,不同字符所对应的ASCII码见下表。
计算机用一个字节(8个二进制位)存储一个字符,例如,字符A的ASCII码为65,它在内存中以如下形式存放:
单个字符的输入/输出函数
除了可以使用scanf()函数、printf()函数处理单个字符的输入/输出,在函数调用的格式控制字符串中对应的格式说明符用%c外,C语言还提供了只能处理单个字符的输入输出函数getchar()和putchar()。
字符输出函数:putchar()
#include<stdio.h>
int main()
{
char c = 'A';
putchar(c);
putchar('A');
putchar('\n'); //输出换行符
putchar('\101'); //八进制对应的字符A
putchar(65); //十进制对应的字符A
}
/**
执行:
AA↙
AA
**/
注意:putchar()函数的参数可以是字符数据(包括转义字符)、整型数据,将该值看成某字符的ASCII码,输出对应字符。
字符输入函数:getchar()
#include<stdio.h>
int main()
{
char c1, c2, c3;
c1 = getchar();
c2 = getchar();
c3 = getchar();
putchar(c1);
putchar(c2);
putchar(c3);
}
/**
输入:
a b c↙
输出:
a b
**/
注意:空格符、制表符和回车符都是合法的ASCII字符,在输入时会被当做普通字符被接收。
字符串
什么是字符串
字符串是由字符组成的串型结构,它的结束标志是’\0’。其中的字符可以包含字符、数字、其他字符、转义字符、汉字。
字符串的定义和初始化
在C语言中,字符串存储在一维字符数组中。每个字符串常量有一个字符串结束标志’\0’隐藏在串最后,标志着该字符串结束。
char str[6] = {'C','H','I','N','A','\0'};
//也可以用字符串初始化数组,上述初始化等价于
char str[6] = {"CHINA"};
//或
char str[6] = "CHINA";
//如果给出了全部元素的初值,则可以省略长度,长度会根据字符串自动调整
char str[] = "CHINA";
未初始化或赋初值的数组元素值不确定:
char a[10];
a[0] = 'C',a[1] = 'H',a[2] = 'I',a[3] = 'N',a[4] = 'A';
初始化的数组,元素值默认为’\0’:
char a[10] = "CHINA";
注意:
-
数组的长度必须比字符串的元素个数多1,用来存储字符串的结束标志’\0’。
-
数组名是地址常量,不能将字符串直接赋值给数组名。
char c[6];c="CHINA"
非法的 -
字符串到第一个’\0’结束,所以常用’\0’判断字符串是否处理完毕。
char c = "abc\0def"
字符串实际存放的是"abc"; -
字符串存储在只读段,不能被修改。一般常用字符串字符值来初始化字符数组,编译器会自动把字符串字面值拷贝到数组中,包括’\0’,之后这个字符串就有了两份,一份在栈中,另一份在只读段。
int main() { char* str = "hehehehe"; str[0] = 'H'; // error }
字符串的输出/输入
字符串输出函数
printf()和puts()会逐个输出字符串中每个元素,知道遇到’\0’。
printf("%s",str);
puts(str) //会自动在末尾添加一个'\n'。
字符串输入函数
//scanf()用格式符"%s"输入若干个字符(可以是汉字)到字符数组,遇到空格、制表符或回车符终止,并写入'\0'。
scanf("%s",str);
//gets()读入一串以回车结束的字符(可以接收空格),顺序存入到以str为首地址的内存单元中,并在最后写入'\0'。
gets(str);
//fgets()能接受到size-1个字符(要为'\0'预留一个)。注意:当输入的字符不足size-1个时会连'\n'一起接收。
fgets(str,size,stdin);
字符串与指针
字符串一般存储在字符数组中,对字符串的访问可以逐个访问数组元素中的字符,或者利用指针访问字符串。
- 字符串指针指向字符串的首字符,它实际上是字符指针,其对象是字符。
- 字符串通常存储在字符数组中,其数组名就是这个字符串的指针。
常用字符串的函数
头文件:string.h
- strlen
功能:计算字符串中字符的个数(不计’\0’)。
C语言源码:
size_t __cdecl strlen (const char * str)
{
const char *eos = str;
while( *eos++ );
return( (int)(eos - str - 1) );
}
- strcat
功能:把字符串2包括(’\0’),复制到字符串1后,函数返回字符串1。
C语言源码:
char * __cdecl strcat (char * dst,const char * src)
{
char * cp = dst;
while( *cp )
cp++;
while( *cp++ = *src++ ) ;
return( dst );
}
- strcpy
功能:字符串2复制到字符串1中,从字符串1指针指的位置开始依次存储字符串2,函数返回值为字符串1指针。
C语言源码:
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ );
return( dst );
}
- strcmp
功能:比较字符串1和字符串2两个字符串的大小。两字符串相同则函数返回值为0;字符串1>字符串2则返回值为1;否则返回-1。
C语言源码:
int __cdecl strcmp (const char * src,const char * dst)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
- atoi, atol, atoll
功能:将字符串转为整数。逐个将字符串转为整数,如果有非整数字符,则终止。
C语言源码:
long __cdecl atol(const char *nptr)
{
int c;
long total;
int sign;
while ( isspace((int)(unsigned char)*nptr) )
++nptr;
c = (int)(unsigned char)*nptr++;
sign = c;
if (c == '-' || c == '+')
c = (int)(unsigned char)*nptr++;
total = 0;
while (isdigit(c)) {
total = 10 * total + (c - '0');
c = (int)(unsigned char)*nptr++;
}
if (sign == '-')
return -total;
else
return total;
- strstr
功能:在str1中查找str2。如果有,返回str2在str1中首次出现的位置下标,如果没有返回NULL。
C语言源码:
char * __cdecl strstr (const char * str1,const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}