字符串儿

本文详细介绍了C语言中字符串的概念,包括字符、串、字符串的定义和它们的存储方式。探讨了字符串的输入与输出,如scanf和printf的使用,以及如何处理输入输出缓冲区。还讲解了字符串的常用操作,如strlen函数,并提到了处理输入缓冲区残留数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串:

字符:

在计算机中字符是以整数形式存储的,当需要显示时
根据ASCII表中的对应关系显示出相应的符号或图案
‘\0’ 0
‘0’ 48
‘A’ 65
‘a’ 97

串:

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

字符串:

有字符组成的串形结构,它的结束标志是’\0’

字符串的输入:

scanf %c
scanf %s 地址
注意:不能接收空格

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

char fgets(char s,int size,stdin);
功能:可以设置输入的字符串的长度为size-1,超出长度时会在末尾给’\0’预留位置,
超出部分会不接收
注意:如果长度不足size-1,则会接收最后输入的’\n’

字符串的输出:

printf %s 地址
int put(const char *s)
功能:输出一个字符串,会在末尾自动打印一个’\n’
返回值:成功输出的字符个数

字符串的存在形式:

字符数组: char str[10] = {‘a’,‘b’,‘c’,…};

由char类型组成的数组,一定要为’\0’预留位置
赋值麻烦
使用的时栈内存,数据是可以修改的

字符串字面值:

“由双引号包含的若干个字符”“hello world”
在末尾隐藏了一个’\0’
字符串字面值就是以地址形式存在的,数据存储在代码段,如果修改则会产生段错误
char* str = “字符串字面值”;
sizeof(“strstr”) 结果= 字符个数+1
两个一模一样的字符串字面值在代码段中只会存在一份
常用方式:字符数组[] = “字符串字面值”;
会自动给’\0’预留位置
赋值完成后字符串会存在由两份,一份存储在代码段,一份存储在栈内存(可以修改)

输出缓冲区:

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

输入缓冲区:

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

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

解决1方法:
只要判断scanf的返回值

2、fgets可以指定读取size-1个字节,如果超出范围,则多余的字符会残留在输入缓冲区
中,会影响接下来的数据的读取

解决2方法:
必须确保缓冲区中有垃圾数据,否则程序会停下来等待接收一个\n
因此可以在清理缓冲区前,判断str末尾是不是\n,是则不用清理,否则需要
清理
1、scanf("%*[^\n]"); 表示从缓冲区中读取并丢弃身居,只要不是\n就一直
丢弃,遇到\n停止
scanf("%*c"); 从缓冲区中读取并丢弃一个字符数据,也就是丢弃剩余的\n
2、stdin->IO_read_pet = stdin->_IO_read_end;
只能在Linux系统上使用,把缓冲区的当前位置指针移动到缓冲区末尾,相当于清理缓冲区

3、当先输入的是 整形或者浮点型时,再输入字符、字符串时会读取到上一次最后输入的残留
的’\n’,会影响字符、字符串的输入
注意:scanf("%s",str) 不会影响字符串的输入
gets(str) 残留的\n会影响字符串的输入

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

字符串的常用操作:

#include(string.h)
size_t strlen(const char *s);
功能:计算字符串长度,结果不包括’\0’ 对比sizeof

char *strcpy(char *dest,const char *src)
功能:把src拷贝到dest,相当于给dest赋值
返回值:dest的首地址,链式调用

char *strncpy(char *dest,const char *src,size_t n);
只拷贝前n个字符

char *strcat(char *dest,const char *src);
功能:把src追加到dest的末尾,  相当于+=
返回值:dest的首地址,链式调用

char *strncat(char *dest, const char *src,size_t n);
只追加前n个数

int strcmp(const char *s1, const char *s2);
功能:比较s1与s2两个字符串,按照字典序比较,谁在前谁小,比较出结果立即返回
返回值:
    s1 > s2     正数
    s1 == s2    0
    s1 < s2     负数


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

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);
功能:字符串转duoble型

char *strstr(const char *haystack,const char *needle);
功能:查找haystack中是否存在neele
返回值:如果存在,则返回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 sscnaf(const char *str,const char *format,...);
功能:从str中解析出各种类型数据


void *memcpy(void *dest,const void *src,size_t n);
功能:从src拷贝n个字节到data中

int memcmp(const void *s1, const void *s2, size_t n);
功能:比较两个内存块,按字节比较
返回值:
    s1>s2   正数
    s1=s2   0
    s1<s2   负数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值