字符:
字符就是符号或图案,在计算机中以整数形式存储的,需要显示时会根据ASCII码表中的对应关系,来显示出显影的图案或符号
'\0' 0
'0' 48
'A' 65
'a' 97
%c %hhd
char ch;
字符的输入:
scanf("%c",&ch);
getchar();
字符的输出:
printf("%c",ch);
putchar(ch);
串:
是一种数据结构,由一组连续的若干个相同类型的数据组成,对这种数据结构的处理都是批量性的,在末尾有一个结束标志,处理会从开头到结束标志为止
字符串:
有字符组成的串行结构,结束标志时'\0'
字符串的输入:
scanf %s 地址
不能接受空格,自动在输入结束后,末尾加'\0'
char *gets(char *s);
功能:输入字符串,并且可以接受空格
返回值:链式调用(一个函数的返回值可以作为另一个函数的参数)
char *fgets(char *s, int size, FILE *stream);
功能:可以设置输入的字符串的长度为size-1,超出部分不接受,会给'\0'预留位置
stream:键盘文件 :标准输入 stdin
注意:输入的长度不足size-1时,会把最后的 \n 一并接受
返回值:链式调用
字符串的输出:
printf("%s",地址);
int puts(const char *s);
功能:输出一个字符串,并且会在打印完后自动再打印一个换行
返回值:成功输出的字符个数
字符串的存在方式:
字符数组: char str[10]={'a','b','c'};
由char字符类型组成的数组,要注意为'\0'预留位置
初始化不方便
使用的是栈内存,数据可以修改
字符串字面值:
"由双引号包含的若干个字符",在末尾隐藏一个'\0'
字符串字面值以地址的形式存在,数据存储在代码段中,如果修改会产生段错误,相当于常量
sizeof("xixi") 计算字符串字面值中所有字符的个数,包括'\0'
const char* p = "字符串字面值";
sizeof(p) 永远是4|8
注意:
常用方式:
初始化:字符数组[] = 字符串字面值;
自动为'\0'预留位置
复制完成后,字符串就存在两份,一份在代码段,一份在栈内存(可修改)
练习1:实现一个判断是否是回文串
练习2:实现一个函数,把一个由数字字符组成的字符串转换成整数值
练习3:实现一个函数把字符串逆序
输出缓冲区:
程序并不会把要输出的数据立即显示到屏幕上,而是先存储在输出缓冲区中,需要满足一定的条件才能显示出来
缓冲区机制可以提高数据的读写速度,另一方面可以让高速的cpu与低速的输入输出设备之间协调工作
刷新输出缓冲区的条件:
1、遇到'\n'
2、遇到输入函数、语句
3、当缓冲区满4kb时
4、当程序结束时
5、手动刷新fflush(stdout);
输入缓冲区:
程序并不会立即回去键盘上输入的数据,当按下回车键,程序才会从输入缓冲区中读取数据
1、当读取整型或者浮点型数据时,如果此时缓冲区中的数据是字母或符号时,此时会读取失败,而且数据会继续残留在缓冲区中,会影响接下来所有数据的读取
解决方法:
判断scanf的返回值,如果返回值小于要接受的变量个数,则先清空输入缓冲区,再重新scanf接受,知道全部成功接受为止
stdin->_IO_read_ptr = stdin->_IO_read_end;
2、fgets可以指定读取size-1个字符,如果有超出部分会残留在输入缓冲区中,也影响接下来的输入
解决方法:
1、 必须确定缓冲区中有残留数据,否则程序会停下来等待一个\n (看封装代码)
scanf("%*[^\n]"); 表示从缓冲区中接受任意字符并丢弃,直到遇到\n才停止
scanf("%*c"); 丢弃最后残留的\n
2、 把输入缓冲区的当前位置指针移动到缓冲区末尾,相当于清理输入缓冲区,但是只能在Linux系统下用
stdin->_IO_read_ptr = stdin->_IO_read_end;
3、如果先输入整型、浮点型数据,再输入字符、字符串时,前一次输入的\n会被残留在输入缓冲区中,就会影响下面的字符、字符串的输入
注意:scanf不影响字符串的输入,但是gets影响
解决方法:
1、scanf(" %c",&ch); %c前面加空格
2、gets(str)前面加 scanf("%*c"); 在缓冲区中读取任意字符并丢弃
字符串相关常用函数:
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串长度,结果不包括'\0'
char *strcpy(char *dest, const char *src);
功能:把src拷贝给dest,相当于给dest赋值 =
返回值:链式调用,dest的首地址
char *strncpy(char *dest, const char *src, size_t n);
功能:把src前n个字符拷贝给dest
char *strcat(char *dest, const char *src);
功能:把src追加到dest的末尾,相当于给dest +=
返回值:链式调用,dest的首地址
char *strncat(char *dest, const char *src, size_t n);
功能:把src前n个字符追加到dest的末尾
int strcmp(const char *s1, const char *s2);
功能:比较s1和s2的大小,按照字典序比较谁在前面谁小,一旦比较出结果后,后面的字符不再比较
返回值:
s1 > s2 正数
s1 < s2 负数
s1 == s2 0
int strncmp(const char *s1, const char *s2, size_t n);
功能:只比较前n个字符
作业:实现四个字符串处理函数
int len(const char *src)
{
const char *temp=src;
while(*temp) temp++;
return temp - src;
}
char *cpy(char *dest,const char *src)
{
char *temp = dest;
while(*temp++=*src++);
return dest;
}
char *cmp(char *dest,const char *src)
{
char *temp = dest;
while(*temp++);
while(*temp++=*src++);
return dest;
}
int cmp(const char *s1,const char *s2)
{
while(*s1 && *s1==*s2) s1++,s2++;
return *s1-*s2;
/* if(*s1 > *s2)
return 1;
if(*s1 < *s2)
return -1;
*/
}
int atoi(const char *nptr);
功能:字符串转int类型
long atol(const char *nptr);
功能:字符串转long类型
long long atoll(const char *nptr);
功能:字符串转long long类型
char *strstr(const char *haystack, const char *needle);
功能:查找haystack中是否存在needle
返回值:存在时,返回needle再haystack中第一次出现的位置,如果不存在时,返回NULL、
char *strchr(const char *s, int c);
功能:查找字符串s中是否有字符c
返回值:如果找到c,返回c在s中第一次出现的地址,找不到返回NULL
int sprintf(char *str, const char *format, ...);
功能:把各种类型的数据输出到字符串中
返回值:返回字符串str的长度
int sscanf(const char *str, const char *format, ...);
功能:从字符串中解析出各种类型的数据
返回值:成功读取到的变量的个数
void *memcpy(void *dest, const void *src, size_t n);
功能:从src内存位置拷贝n个字节到dest内存位置
返回值:dest首地址
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较两块内存是否相等,按字节比较,比较前n个字节
返回值:
s1 > s2 正数
s1 < s2 负数
s1 == s2 0
void *memmove(void *dest, const void *src, size_t n);
功能:移动src到dest中,就算有重合部分,也不影响正确性
本文详细介绍了字符、字符串及其在计算机中的存储和处理,包括ASCII码、字符输入输出、字符串定义、输入输出函数、字符串操作如复制、比较、转换及常见库函数的使用。同时涵盖了回文串判断、数值转换和字符串逆序等实践练习。
5523

被折叠的 条评论
为什么被折叠?



