字符和字符串简介

字符:

	在计算机中是以整型形式存储的,当需要显示时会根据ASCII表中的对应关系显示出相
应的符号或者图案
    '\0'    0
    '0'     48
    'A'     65
    'a'     97
    %c      %d

char ch;
字符的输入:
    scanf("%c",&ch);
    ch = getchar();
字符的输出:
    printf("%c",ch);
    putchar(ch);

串:

串是一种数据结构,是由一组类型相同的若干个数据组成,末尾有结束标志
对于这种数据结构的处理都是批量性的,从开头位置一直处理到结束标志为止

字符串:

由字符组成的串型结构,结束标志是 '\0'

字符串的输入:

scanf("%s",地址);
缺点:不能输入空格

char *gets(char *s);
功能:输入字符串,并且可以接受空格
返回值:链式调用(把一个函数的执行结果,通过返回值作为另一个函数的参数)

char *fgets(char *s, int size, FILE *stream);
功能:可以设置输入的字符串的长度为size-1,超出部分不会接受,它会为'\0'预留位置
s:字符数组首地址
size:输入字节数
stream:stdin
如果输入的字符不足size-1,最后的\n会被一起接受

字符串的输出

printf("%s",地址);

int puts(const char *s);
功能:输出一个字符串,会在末尾自动打印一个\n
返回值:唱功输出的字符个数

字符串的存在形式:

字符数组:
    char str[10] = {'a','b','c'...};
    由char类型组成的数组,要为'\0'预留位置,初始化麻烦
    使用的是栈内存,数据可以随意修改

字符串字面值:
    "由双引号包含的若干个字符"
    在末尾隐藏一个'\0'
    字符串字面值是以地址形式存在的,数据存储在代码段中,如果修改就会段错误
    注意:它的结束标志是加在末尾的
    printf("%d\n",sizeof("123123"));
    注意:字符个数+1
    printf("%d\n",sizeof(p));
    注意:指针的字符个数 4|8
    两个一模一样的字符串字面值在代码段只有一份

常用方式:
    字符数组[] = "字符串字面值";
    会自动给'\0'预留位置
    赋值完以后字符串会留两份,一份存在text段,一份存在stack段

练习:实现一个函数,判断字符串是否是回文串;一个函数,把数字组成的字符串转换成整数;一个函数,把一个字符串逆序

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//	将一串字符串逆序
void palin(char arr2[],int cnt)
{
	for(int i = 0; i<cnt/2; i++)
	{
		char tmp = arr2[i];
		arr2[i] = arr2[cnt-i-1];
		arr2[cnt-i-1] = tmp;
	}
}

//	判断是否回文
bool is_pld(char arr1[],char arr2[],int cnt)
{
	for(int i = 0; i<cnt; i++)
	{
		if(arr1[i] != arr2[i])
		{
			printf("非回文!\n");
			return false;
		}
	}
	printf("回文!\n");
	return true;
}

//	将字符串转换为int输出
void change_int(char arr1[],int cnt)
{
	for(int i = 0; i<cnt; i++)
	{
		printf("%d ",arr1[i]-'0');
	}
}

int main(int argc,const char* argv[])
{
	char arr1[] = "12345654321";
	char* arr2 = NULL;
	int cnt = 0;
	for(int i = 0; '\0' != arr1[i]; i++)
	{
		arr2 = realloc(arr2,sizeof(char)*(i+1));
		arr2[cnt++] = arr1[i];
	}
	palin(arr2,cnt);
	printf("字符串逆序:\n");
	for(int i = 0; i<cnt; i++)
	{
		printf("%c",arr2[i]);
	}
	printf("\n");
	is_pld(arr1,arr2,cnt);
	printf("字符串强转整数:\n");
	change_int(arr1,cnt);
}

输出缓冲区:

	程序并不会立即把输出的数据显示到屏幕上,而是先存储在输出缓冲区中,当满足一定
条件时才显示出来
    1、遇到\n
    2、程序结束
    3、遇到输入语句刷新缓冲区
    4、当缓冲区满4k时
    5、fflush(stdout) 手动刷新
	缓冲区机制可以提高数据的读写速度,并且可以让低速的输入输出设备与高速的cpu之
间协调工作

输入缓冲区:

程序并不会立即获得屏幕上输入的数据,而是按下回车键后程序才从输入缓冲区读取数据

	1、当需要读取的是整型或者浮点型时,而输入缓冲区中的数据是字符或符号时,此时
读取会失败,数据会残留在输入缓冲区中,就会影响接下来的所有数据的读取

	2、fgets可以指定读取size-1个字符,如果有多余的会残留在输入缓冲区中,影响下
一次输入

	3、当先输入整型、浮点型数据,再紧接着输入字符、字符串时,前一次残留的'\n'或
空格,会影响字符、字符串的输入

解决3: %c前面加空格
        scanf(" %c",&ch)

解决2: 
    方法一:
    	必须确认缓冲区中有垃圾数据时,才能去读取丢弃输入缓冲区的垃圾数据,否则程
    序会停下来等待缓冲区中有一个\n
        scanf("%*[^\n]");
            表示从缓冲区中接收任意字符并丢弃,只要不是\n就一直进行,遇到\n才停下
        scanf("%*c");
            丢弃任意字符,把\n丢掉
    方法二:
        借助缓冲区的位置指针移动到缓冲区的末尾,实现清理缓冲区的效果
        只能在linux系统下使用
        stdin->_IO_read_ptr = stdin->_IO_read_end;

解决1:
    	借助scanf返回值判断是否接收成功,如果接收过程有失败情况,可以先清理输入
    缓冲区,再重新循环接受数据,直到完全接收成功为止

字符串常用相关操作

#include <string.h>

size_t strlen(const char *s);
功能:计算字符串长度,不包括'\0'
注意:sizeof 和 strlen 的区别

char *strcpy(char *dest, const char *src);
功能:把src拷贝到dest,相当于给dest赋值 = 
返回值:返回dest用于链式调用
char *strcat(char *dest, const char *src);
功能:把src字符串追加到dest后面,相当于 +=
返回值:返回dest用于链式调用
int strcmp(const char *s1, const char *s2);
功能:比较两个字符串的大小,按照字典序比较,谁在前谁小
返回值:
    s1 > s2 正数
    s1 < s2 负数
    s1 == s2 0
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较两个字符串前n个字符的大小,按照字典序比较,谁在前谁小
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

#include <stdlib.h>
int atoi(const char *nptr);
功能:字符串转int类型
long atol(const char *nptr);
功能:字符串转long类型
long long atoll(const char *nptr);
功能:字符串转long long类型
double atof(const char *nptr);
功能:字符串转double类型
char *strstr(const char *haystack, const char *needle);
功能:查找haystack,是否存在needle
返回值:needle首次在haystack中出现的位置,如果找不到返回NULL

char *strchr(const char *s, int c);
功能:查找s中是否有字符c
返回值:c在s中首次出现的位置,不存在返回NULL
int sprintf(char *str, const char *format, ...);
字符串拼接
功能:把各种类型数据输出到str中
返回值:拼接后str的长度
int sscanf(const char *str, const char *format, ...);
功能:从str中读取解析各种类型的数据
返回值:成功读取到的变量的个数

void *memcpy(void *dest, const void *src, size_t n);
功能:从src位置拷贝n个字节到dest中
int memcmp(const void *s1, const void *s2, size_t n);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值