C字符学习笔记

字符处理理解

//字符串和字符串函数
#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++;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值