C语言字符串知识点整理

字符串知识点整理

关键词:字符、字符相关常用函数,字符串字面值,字符串输入输出函数,字符串相关函数。puts/printf/scanf/gets/fgets/strlen/strcmp/strcat/strcpy/strstr…

  • 字符

    字符就是符号或图案,在C代码中以整数形式模拟,当需要显示时再根据ASCII码显示出相应的符号或图案。

    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的值为零,会打印错误信息,并停止程序。
//可用来检查变量是否有值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值