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