C语言之字符串

字符

什么是字符

字符就是符号、图案,在计算机中以整数形式存储,当需要显示时会根据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. 数组的长度必须比字符串的元素个数多1,用来存储字符串的结束标志’\0’。

  2. 数组名是地址常量,不能将字符串直接赋值给数组名。
    char c[6];c="CHINA" 非法的

  3. 字符串到第一个’\0’结束,所以常用’\0’判断字符串是否处理完毕。
    char c = "abc\0def" 字符串实际存放的是"abc";

  4. 字符串存储在只读段,不能被修改。一般常用字符串字符值来初始化字符数组,编译器会自动把字符串字面值拷贝到数组中,包括’\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);

字符串与指针

字符串一般存储在字符数组中,对字符串的访问可以逐个访问数组元素中的字符,或者利用指针访问字符串。

  1. 字符串指针指向字符串的首字符,它实际上是字符指针,其对象是字符。
  2. 字符串通常存储在字符数组中,其数组名就是这个字符串的指针。

常用字符串的函数

头文件:string.h

  1. strlen
    功能:计算字符串中字符的个数(不计’\0’)。
    C语言源码:
	size_t __cdecl strlen (const char * str)
	{
	const char *eos = str;
	while( *eos++ );
	return( (int)(eos - str - 1) );
	}
  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 );
	}
  1. strcpy
    功能:字符串2复制到字符串1中,从字符串1指针指的位置开始依次存储字符串2,函数返回值为字符串1指针。
    C语言源码:
	char * __cdecl strcpy(char * dst, const char * src)
	{
		char * cp = dst;
		while( *cp++ = *src++ );              
		return( dst );
	}
  1. 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 );
}
  1. 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;
  1. 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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值