字符处理理解
//字符串和字符串函数
#include<stdio.h>
/*
字符串是以空字符节位的char
*/
#define SIZE 56
#define DEF "aaaaaaa aaaa"
int main()
{
puts("AAAAAA");//显示字符串并自动在显示字符串末尾加上换行符
char x[50]="a b c d";//双引号内容称为string constant,编译器自动加\0在结尾。
printf(" \" ana nan \" "); //内部双引号使用方法
const char m[3]="abc";//字符串简易初始化 常用
const char n[3]={'a','b','c','\0'};//字符串标准初始化
//指定数组大小要确保数组的元素至少比字符串的长度多1,多余未初始化的元素自动初始化为\0
/*
让编译器计算数组大小只能用在初始化数组时。若要创建一个稍后再填充的数组则必须声明大小。
在C99新增变长数组之前,数组的大小必须是int*/
int n=8;
char num[n];//在C99新增变长数组之前,数组的大小必须是int,但是我的编译器提示报错
const char *pt="abc";
const char as[]="abc";
/*
数组形式在计算机的内存中分配为一个内含3个元素的字符数组,每个元素初始化为字符串常量。
字符串可以作为执行文件的一部分存储在数据段。当程序载入内存也载入字符串。但是只有在程序
运行的时候才会为数组分配内存,此时将字符串拷贝到数组中。此时,字符串有两个存储,一是char constant在静态内存中
二是在定义的数组中,可以as+1,不能as++,即as不能改变,因为as中存储的是数组的首地址
指针形式,compiler为字符串在静态存储区预留3个元素空间,执行开始程序会给pt留出存储位置,存储字符串的地址
指针变量可以改变,移动到其他位置。
*/
//二者的区别,heart常量,head是变量
char heart[]="bca";
const char *head="bca";
heart[1];head[1];
*(heart+1);*(head+1);
//
const char *x[40]={"compare","talent","data","sleep"};
char y[40][5]={"abc","read","watch","talent"};
/*
x是内含五个指针数组,占40字节。y是内含五个数组的数组,每个数组占40个字节。
x[0] y[0]都是表示一个字符串,但是类型不同,x指针指向初始化使用的字符串常量的位置,
字符串常量存在静态存储区。y数组中存储字符串常量的副本,故每个字符串存储两次,内存使用率低。
同时,y中的每个元素大小必须相同,且必须是能存储最长字符串的大小。末尾空余位置用\0填充
综上,指针数组适合表示一系列待显示的字符串。但是x中的内容不能更改,y可以。
*/
//gets()函数:读取整行输入,直至遇到换行符,丢弃换行符,存储其余字符,并在end添加\0
char words[SIZE];
gets(words);
puts(words);//显示字符,并在end添加换行符
//fgets()函数:专门设计用于处理文件输入
fgetwc(words);
//处理换行符
for (int i = 0; i < sizeof(words); i++)
{
if(words[i]=='\n')
{
words[i]='\0';
}
i++;
}
//scanf和gets的区别就在如何确定字符串结尾,scanf是单词输入,gets是找换行符短剧
//空白字符:空行、空格、制表符、换行符
char name1[11],name2[11];
int count;
count=scanf("%5s %10s",name1,name2);
//scanf的典型用法是读取并转换数据类型为某种标准形式。fgets更适合读取键盘输入
//字符串输出
// #define DEF "aaaaaaa aaaa"
char str1[100]="fasfdsad sdasdasda";
const char *str2="A B C D E";
puts(str1);//在遇到空字符时停止
fputs();//针对文件的定制版本,
//输入输出
char line[81];
while (gets(line))
{
puts(line);
}
while (fgets(line,81,stdin)) //二者等价,但是要搭配使用因为存在换行符的问题
{
fputs(line,stdout);
}
//自定义输出输入函数
}
字符处理函数库
#include "char_io.h"
#include<string.h>
#include<ctype.h>
void put1(const char *string) //不会添加换行符的puts
{
while (*string!='\0')
{
putchar(*string++);
}
//两种方法一样,但是后者需要开辟内存存储i
int i=0;
while (string[i]!='\0')//while(*string);
{
putchar(string[i++]);
}
while(*string);
}
//只要函数不改变传入的参数,就加上const
void stsrt(char *strings [],int num)
{
//冒泡排序核心就是内层循环每一次就把最大放到最后
char *temp;
int top,seek;
for ( top = 0; top < num-1; top++)
{
for ( seek = top+1; seek < num; seek++)
{
if (strcmp(strings[top],strings[seek])>0)
{
temp=strings[top];
strings[top]=strings[seek];
strings[seek]=temp;
}
}
}
}
char * s_gets(char *st,int n)
{
char *ret_val;
int i=0;
ret_val=fgets(st,n,stdin);
if (ret_val)
{
while (st[i]!='\n'&&st[i]!='\0')
{
i++;
}
if (st[i]=='\n') //空字符替换换行符
{
st[i]='\0';
}
else
while (getchar()!='\n')
{
continue;
}
}
return ret_val;
}
void toUpper(char *str)
{
while (*str)
{
*str=toupper(*str);
str++;
}
}
int PuntCount(const char *str)
{
int ct;
while (*str)
{
if (ispunct(*str))
{
ct++
}
str++;
}
}