字符串和输入输出缓冲区

2023年2月25日11:29:12

字符串

字符:在计算机中字符是以整数形式存在的,当需要使用时会根据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  负数

  • 作者:Mikoto_10032
  • 原文链接:https://blog.csdn.net/weixin_51420051/article/details/109385869
    更新时间:2023年2月25日11:29:12 ,共 2531 字。