字符串和输入输出缓冲区

字符串

​ 字符:在计算机中字符是以整数形式存在的,当需要使用时会根据ASCLL码表中的对应关系来显示相应的符号或图案

​ 0 ‘\0’

​ 48 ‘0’

​ 65 ‘A’

​ 97 ‘a’

​ 串: 一种数据结构,由一组连续的若干个相同类型的数据组成。

​ 末尾有一个结束标志。

​ 对于串行结构的处理都是批量性的,从开头位置直到遇到了结束标志停止。

​ 字符串:由字符组成的串型结构,由’\0’结尾

字符串的输入

​ scanf %s 地址

​ 缺点:不接收空格

​ char *gets(char *s)

​ 功能:输入字符串,可以接受空格

​ 返回值:链式调用(把一个函数的返回值,作为另一个函数的参数)

​ char *fgets(char *s, int size, FILE *stream);

​ 功能:可以设置输入的字符串的长度为size-1,超出部分不接收,强制在末尾位’\0’预留位置

注意:

​ gets(str); 输入字符串时不限制长度,有安全隐患

​ fgets(str,size,stdin); 可以设置只接收size-1个字符(给\0预留位置),如果输入的字符不足 size-1,会把\n一起接收

字符串的输出

​ int puts(const char *s);

​ 功能:输出一个字符串,会在末尾位置自动添加\n

​ 返回值:成功输出的字符的个数

字符串的存在形式

​ 字符数组:char arr[10] = { ’ 1 ', ’ 2 ’ , ’ 3 ’ };

​ 由char类型组成的数组

​ 注意:主动为\0,预留位置

​ 使用的是栈内存,数据可以修改

​ 字符串字面值

​ “由双引号包含的若干个字符”,默认末尾加上\0

​ 字符串字面值是以地址形式存在的,储存在代码段,如果强行修改就会产生段错误

​ const char* str = “字符串字面值”

​ sizeof(“strstr”) 输出 字符个数+1;

​ 注意:两个一模一样的字符串字面值在代码中只有一份

​ 一般使用字符串字面值来初始化字符数组

​ 常用方式:

​ 字符串数组[] = “字符串字面值”;

​ char str[20] = “hello world”;

​ 会自动为\0预留位置,而且可以修改值

​ 赋值完后字符串存在两份,一份储存在代码段,另一份在栈内存(这份可以修改)

输出缓冲区

​ 程序输入的数据并不能立即显示到屏幕上,而是先存储到输出缓冲区内,满足一定条件显示

​ 1、遇到\n立即显示

​ 2、遇到输入语句

​ 3、当输出缓冲区满4K

​ 4、程序结束

​ 5、手动刷新缓冲区 fflush(stdout)

​ 缓冲区机制可以提高数据的读写数据

输入缓冲区

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

​ 1、当需要读取整型或者浮点型时,而缓冲区中的数据是字符或字母时,此时读取失败,数据残留在缓冲区中,就有可能影响接下来的数据的读取。

​ 2、fgets可以指定读取size-1个字符,如果有多余的会残留在缓冲区中。

​ 3、当先输入整型、浮点型数据,再输入字符、字符串,前一次会残留一个’\n’,会影响字符、字符串的输入

​ scanf("%c") get(str);

​ 解决方法1:确定缓冲区中有垃圾数据,否则程序会定下来等待一个\n

​ scanf("%*[^\n");

​ scanf("%*c");

​ 解决方法2:把输入缓冲区的当前位置指针移动到末尾

​ stdin -> _IO_read_ptr = stdin -> _IO_read_end;

​ 解决方法3:判断scanf()的返回值

字符串常用操作

#include<stdio.h>

int sprintf(char *str, const char *format, ...);
//功能:把各种类型的数据输出到字符串str中
//返回值:字符串str的长度
int sscanf(const char *str, const char *format, ...);
//功能:把字符串str的数据输入到指定变量中
//返回值:成功读取到的变量的个数
#include<stdlib.h>

int atoi(const char *nptr);
功能:将字符串转成int类型
long atol(const char *nptr);
功能:字符串转long
long long atoll(const char *nptr);
功能:字符串转longlong
double atof(const char *nptr);
功能:字符串转double

#include <string.h>

size_t strlen(const char *s);
功能:计算字符串的长度,不算'\0'
char *strcpy(char *dest, const char *src);
功能:把str拷贝到dest,相当于给dest赋值 = 
返回值:dest 链式调用
char *strncpy(char *dest, const char *src, size_t n);

char *strcat(char *dest, const char *src);
功能:把str追加到dest后面,想当于给dest +=
char *strncat(char *dest, const char *src, size_t n);

int strcmp(const char *s1, const char *s2);
功能:比较两个字符串,根据字典序,谁在前面谁小
返回值:s1 > s2	正数
		s1 = s2    0
		s1 < s2    负数


int strncmp(const char *s1, const char *s2, size_t n);
功能:只比较n个字符

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

void *memset(void *s,int c,size_t n)
功能:将已开辟内存空间 s 的首 n 个字节的值设为值 c
	   memset可以方便的清空一个结构类型的变量或数组

void *memcpy(void *dest, const void *src, size_t n);
功能:从src中拷贝n个字节到dest中
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较两块内存是否相等,按字节比较
返回值:
		s1 > s2	 正数
		s1 = s2	 0
		s1 < s2  负数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值