字符串知识点整理
关键词:字符、字符相关常用函数,字符串字面值,字符串输入输出函数,字符串相关函数。puts/printf/scanf/gets/fgets/strlen/strcmp/strcat/strcpy/strstr…
-
字符
字符就是符号或图案,在C代码中以整数形式模拟,当需要显示时再根据ASCII码显示出相应的符号或图案。
需要关注的几个ASCII码值,‘0’–48,‘A’–67,‘a’–97,’\0’–0 -
与字符相关的常用函数及简单说明
头文件为:#include <ctype.h>
int isalnum( int ch ); 功能:ch是数字或字母字符,函数返回非零值,否则返回零。
int isalpha( int ch ); 功能:ch是字母,函数返回非零值,否则返回零。
int isdigit( int ch ); 功能:ch是数字,函数返回非零值,否则返回零。
int islower( int ch ); 功能:ch是小写字母字符,函数返回非零值,否则返回零。
int isupper( int ch ); 功能:ch是大写字母字符,函数返回非零值,否则返回零。
int isxdigit( int ch ); 功能:ch是十六进制数字字符(即:A-F,a-f,0-9),函数返回非零值,否则返回零。
-
串型结构
由若干个相同类型的数据组成,有一个确定的结束标志,对数据的处理是连续的,直到遇见结束标志为止。 -
字符串:
由字符组成的串型结构,结束标志是’\0’。 -
字符串字面值
1、由 “” 双引号包含的若干个字符,它存储在text代码段(因此不能修改),以地址形式呈现,占位符%s。
2、可以用const char*指针变量来存储他们的地址,否则会产生段错误。
3、虽然以地址形式呈现,但它与数组名相似,且末尾有隐藏的结束标志\0,所以可以sizeof计算出的是字符数量+1,如sizeof“hehehe”<=> 7,而不是6。
4、相同的字符串字面值,在代码段中只存一份。
另外,在linux系统下,一个汉字占3个字节,windows下一个汉字占2个字节。所以linux下,sizeof"陈奕迅"=10。 -
字符数组
char arr[10];
char arr[5]={‘1’,‘2’,‘3’,‘4’,’\0’};
1、只要有’\0’结尾,字符数组可以当字符串使用;
2、如果没有\0,把字符数组当字符串使用,会越界访问可能有出现乱码,有可能产生段错误;
3、可以使用字符串字面值给字符数组初始化,不需要设置长度,编译器会自动计算,并且会给’\0’留位子;
char arr[]=“12345678”; printf("%s",arr) => 12345678,且默认有’\0’,sizeof=9
4、字符数组被初始化完成后,程序中就有了两份相同字符串,一份在代码段(只读),一份在栈(可读写)。 -
字符串输入
1、scanf:
占位符%s,存储在char*地址(char 数组) ,scanf函数会自动在末尾加’\0’,
scanf不会限制所输入字符的长度,直到遇见Enter键,所以可能会越界,产生段错误
scanf 不接受空格,遇到空格后就停止接收,空格后的字符不会接收,因此无法接收带空格的字符串
int num;
scanf("%d",&num)
2、gets:
专门用来接收字符串的函数,可以接收带空格的字符串。同样不能限制输入的字符串长度和scanf一样
char str[20] = "\0";
printf("请输入字符串:");
gets(str);
3、fgets(char *s, int size,FILE *stream):
该函数可以从指定的文件中读取不超过size-1个字符,当达到size-1个字符会自动停止,它会强行给’\0’预留位置。
终端就是个特殊的文件,文件指针是:stdin fgets(str,21,stdin)
注意:如果输入的字符不足size-1个,会连‘\n’一起接收
如果输入的字符超过size-1个,超出部分的数据会残留在缓冲据当中,影响后续数据的输入
因此可以使用清理缓存的指令,对fgets进行封装使用
stdin->_IO_read_ptr = stdin->_IO_read_end
char* get_str(char* str,size_t size)
{
// 限制输入的字符度
fgets(str,size,stdin);
// 计算实际输入的字符数量
size_t len = strlen(str);
// 判断最一个字符是否是'\n'
if('\n' == str[len-1])
{
// 删除'\n'
str[len-1] = '\0';
}
else
{
// 清理输入缓冲区
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
return str;
之后可以直接使用get_str()进行输入
printf("请输入姓名:");
get_str(name[i],10);
-
字符串的输出:
1、printf:最常用的输出函数,占位符:%s , 功能:输出字符串
2、int puts(const char *s); 功能:输出字符串,会自动添加’\n’,返回值:输出的字符个数
puts("hello world!")
-
对字符串操作:
标准库中,string.h几乎都是处理字符串的函数,常用的有:
size_t strlen(const char *s) 功能:计算字符串长度,结果不包含'\0'、
char *strcpy(char *dest,const char * src) 功能:拷贝字符串,相当于普通变量的赋值语句,如果目标dest空间不够,可能会产生段错误
char *s strcat(char *dest,const char * src) 功能:把字符串src追加到dest的末尾,相当于普通变量的+=
int strcmp(const char *s1,const char * s2) 功能:比较两个字符串,按首字母顺序(字典序),小的排在前面
s1>s2 返回正值 s1<s2 返回负值 s1 == s2 返回 0
注意:以上四个函数要求能自己也能写函数实现,面试常考
char *strncpy(char *dest, const char *src, size_t n);
功能:从src拷贝n个字符到dest
char *strncat(char *dest, const char *src, size_t n);
功能:从src拷贝n个字符追加到dest字符串的末尾
int strncmp(const char *s1, const char *s2, size_t n);
功能:按照字典序比较字符s1和s2,只比较前n个字符
char *strchr( const char *str, int ch );
功能:在str中查找字符ch首次出现位置,如果找不到返回NULL
char *strstr( const char *str1, const char *str2 );
功能:在str1中查找字符串str2首次出现的位置,如果找不到返回NULL
int atoi(const char *nptr);
功能:把字符串转换成int类型整数
long atol(const char *nptr);
功能:把字符串转换成long类型整数
long long atoll(const char *nptr);
功能:把字符串转换成long long类型整数
- 其他
void assert(int exp); //头文件 assert.h
//当exp的值为零,会打印错误信息,并停止程序。
//可用来检查变量是否有值