首頁 > 軟體

C語言封裝函數位符串練習彙總分享

2022-03-21 19:00:03

封裝函數: 判斷閏年和平年

該函數判斷傳入的年份是否是閏年和平年,通過返回值表示結果。

#include <stdio.h>
//函數宣告
int GetYearSate(int year);

int main()
{
    int year;
    printf("請輸入年份:");
    scanf("%d",&year);
    //判斷閏年和平年
    if(GetYearSate(year))
    {
        printf("平年.n");
    }
    else
    {
        printf("閏年.n");
    }
    return 0;
}

/*
函數功能: 判斷平年閏年
返回值: 0表示閏年 1表示平年
*/
int GetYearSate(int year)
{
    if((year%4==0 && year%100!=0)||(year%400==0))
    {
        return 0;
    }
    return 1;
}

封裝函數: 字串查詢(參考strstr)

第一步檢視幫助: man strstr

#include <stdio.h>
#include <string.h> //宣告函數的
char *my_strstr(char *src_str,char *find_str);
int main()
{
    char src_str[100];//"123456789"
    char find_str[100];
    printf("請輸入字串:");
    scanf("%s",src_str);
    printf("請輸入查詢的字串:");
    scanf("%s",find_str);
    
    //strstr() //查詢到指定的字串,會返回查詢字串在源字串裡的首地址
    printf("查詢的字串結果:%sn",strstr(src_str,find_str));
    printf("查詢的字串結果:%sn",my_strstr(src_str,find_str));
   return 0;
}

//函數功能: 字串查詢函數
//返回值: 返回查詢到的字串地址
char *my_strstr(char *src_str,char *find_str)
{
    int src_len;
    int find_len;
    int i,j;
    src_len=strlen(src_str);
    find_len=strlen(find_str);
    for(i=0;i<src_len;i++)
    {
        for(j=0;j<find_len;j++)
        {
            if(src_str[i+j]!=find_str[j])break;
        }
        //判斷是否查詢成功
        if(j==find_len)
        {
            //return &src_str[i];
            return src_str+i;
        }
    }
    return NULL;
}

封裝函數: 字串比較(參考strcmp)

#include <stdio.h>
#include <string.h> //宣告函數的
int my_strcmp(char *s1,char *s2);

int main()
{
    char str1[100];//"123456789"
    char str2[100];
    printf("請輸入字串1:");
    scanf("%s",str1);
    printf("請輸入字串2:");
    scanf("%s",str2);
    
    //int strcmp(const char *s1, const char *s2);
    //比較兩個字串是否相等。通過返回值表示。
    printf("比較字串的結果:%dn",strcmp(str1,str2));
    printf("比較字串的結果:%dn",my_strcmp(str1,str2));
    return 0;
}

/*
函數功能: 比較兩個字串是否相等
返回值:   0表示相等 1表示不相等
*/
int my_strcmp(char *s1,char *s2)
{
    while(*s1!='' && *s2!='')
    {
        if(*s1!=*s2)break;
        s1++;
        s2++;
    }
    if(*s1==''&&*s2=='')return 0;
    return 1;
}

封裝函數: 字串拼接(參考strcat)

#include <stdio.h>
#include <string.h> //宣告函數的
char *my_strcat(char *s1,char *s2);

int main()
{
    char str1[100];//"123456789"
    char str2[100];
    printf("請輸入字串1:");
    scanf("%s",str1);
    printf("請輸入字串2:");
    scanf("%s",str2);
    
    //strcat 字串拼接函數,拼接之後返回源字串的首地址
   // printf("拼接的結果:%sn",strcat(str1,str2));
    printf("拼接的結果:%sn",my_strcat(str1,str2));
    return 0;
}

//函數功能: 字串拼接
char *my_strcat(char *s1,char *s2)
{
    char *p=s1; //記錄源字串的首地址
    while(*s1 != ''){s1++;} //偏移到結尾
    while(*s2!='')
    {
        *s1=*s2;
        s2++;
        s1++;
    }
    *s1='';
    return p;
}

封裝函數: 字串轉整數(參考atoi)

#include <stdio.h>
#include <string.h>
int my_atoi(char *str);
int main()
{
    char buff[100];
    printf("請輸入一個整數位符串:");
    scanf("%s",buff);
    //字串轉整數
    printf("轉換結果:%dn",atoi(buff));
    printf("轉換結果:%dn",my_atoi(buff));
    return 0;
}

/*
函數功能: 字串轉整數
函數形參: 傳入待轉換的字串(0~9)
返回值: 返回轉換的整數結果,如果轉換失敗返回0
*/
//"123ABC"
int my_atoi(char *str)
{
    int data=0;
    while(*str!='')
    {
        if(*str>='0' && *str<='9')
        {
            data*=10; //0  10 120
            data+=*str-'0';//1 12 123
        }
        else
        {
            break;
        }
        str++;
    }
    return data;
}

封裝函數: 字串轉浮點數(參考atof)

「123.456789」    456789—>0.456789
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

double my_pow(double x,int y);
double my_atof(char *str,int cnt);

int main()
{
    char buff[100];
    printf("請輸入一個浮點數位符串:");
    scanf("%s",buff);
    //字串轉浮點數
    printf("轉換結果:%lfn",atof(buff));
    printf("轉換結果:%lfn",my_atof(buff,3));
    return 0;
}

/*
函數功能: 字串轉浮點數
函數形參: str是傳入待轉換的字串   cnt是保留的小數點位數
返回值: 返回轉換的整數結果,如果轉換失敗返回0
*/
//"123.456  123"
double my_atof(char *str,int cnt)
{
    int data=0;
    int cnt_f=0;
    double data_f=0.0;
    while(*str!='' && *str!='.')
    {
        if(*str>='0' && *str<='9')
        {
            data_f*=10;
            data_f+=*str-'0';
        }
        else
        {
            break;
        }
        str++;
    }
    str++; //跳過 "."   "123.456789"
    while(*str!='' && cnt_f!=cnt)
    {
        if(*str>='0' && *str<='9')
        {
            data*=10;
            data+=*str-'0';
            cnt_f++; //記錄小數部分數量
        }
        else
        {
            break;
        }
        str++;
    }
    
    //合成浮點數  "123.456"
    if(cnt>cnt_f)
    {
        cnt=cnt_f;
    }
    data_f+=data*my_pow(0.1,cnt);
    return data_f;
}

//函數功能:計算x的y次方
//my_pow(2,3);
double my_pow(double x,int y)
{
    double tmp=1.0;
    int i;
    for(i=0;i<y;i++)
    {
        tmp=tmp*x;//2.0  4.0  8.0
    }
    return tmp;
}

封裝函數: 整數轉字串 123 “123”

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void int_to_str(char *str,int data);
int main()
{
    int data;
    char buff[100];
    printf("請輸入一個整數:");
    scanf("%d",&data);
    //整數轉字串
    int_to_str(buff,data);
    printf("buff=%sn",buff);
    return 0;
}

/*
函數功能: 整數轉字串
*/
void int_to_str(char *str,int data)
{
    char buff[100]; //存放第一次分離的資料
    int i=0;
    int j=0;
    while(data) //123
    {
        buff[i]=data%10+'0';
        data=data/10;
        i++;
    }
    for(j=0;j<i;j++)
    {
        str[j]=buff[i-1-j];
    }
    str[j]='';
}

//函數功能:計算x的y次方
//my_pow(2,3);
double my_pow(double x,int y)
{
    double tmp=1.0;
    int i;
    for(i=0;i<y;i++)
    {
        tmp=tmp*x;//2.0  4.0  8.0
    }
    return tmp;
}

封裝函數: 浮點數轉字串 123.456 – “123.456”

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int my_pow(int x,int y);
void int_to_str(char *str,int data);
void double_to_str(char *str,double data_f,int cnt);
int main()
{
    double data;
    char buff[100];
    printf("請輸入一個浮點數:");
    scanf("%lf",&data);
    double_to_str(buff,data,5);
    printf("buff=%sn",buff);
    return 0;
}

/*
函數功能: 浮點數轉字串
*/
void double_to_str(char *str,double data_f,int cnt)
{
    char buff[50]; //存放第一次分離的資料
    int i=0;
    int j=0;
    int n=0;
    int data_i1;
    int data_i2;
    double temp_f;
    /*1. 分離整數部分*/  //123.3
    data_i1=data_f; //123
    temp_f=data_f-data_i1;
    data_i2=temp_f*my_pow(10,cnt); //456
    /*2. 轉換整數部分*/
    while(data_i1)
    {
        buff[i]=data_i1%10+'0';
        data_i1=data_i1/10;
        i++;
    }
    /*3. 將整數部分放到陣列裡*/
    for(j=0;j<i;j++)
    {
        str[j]=buff[i-1-j];
    }
    str[j]='.';
    /*4. 轉換小數部分*/   // "123.456"
    while(data_i2)
    {
        buff[n]=data_i2%10+'0';
        data_i2=data_i2/10;
        n++;
    }
    /*5. 將小數部分放到陣列裡*/
    for(j=0;j<n;j++)
    {
        str[j+i+1]=buff[n-1-j];
    }
    str[j+i+1]='';
}

//函數功能:計算x的y次方
//my_pow(2,3);
int my_pow(int x,int y)
{
    int tmp=1;
    int i;
    for(i=0;i<y;i++)
    {
        tmp=tmp*x;//2.0  4.0  8.0
    }
    return tmp;
}

浮點數轉字串 123.456  -- 「123.456」 

float a=123.456;
int b=a; //b=123
a=a-b;  //a=0.456  10*10*10

封裝函數: 判斷迴文字串

該函數判斷傳入的字串是否是迴文,通過返回值表示結果。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int func(char *p);
int main()
{
    char buff[100];
    printf("輸入字串:");
    scanf("%s",buff);
    if(func(buff))printf("迴文.n");
    else printf("不是迴文.n");
    return 0;
}

//函數功能: "123"  "121"
int func(char *p)
{
    int i;
    int len;
    len=strlen(p);
    for(i=0;i<len/2;i++)
    {
        if(p[i]!=p[len-1-i])break;
    }
    if(i==len/2)return 1; //迴文
    return 0; //不是迴文
}

封裝函數: 字串替換

將源字串裡指定的單詞替換成指定單詞。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void str_func(char *str1,char *str2,char *str3);
int main()
{
    char str1[100];
    char str2[100];
    char str3[100];
    /*1.準備資料*/
    printf("輸入源字串:");
    scanf("%s",str1);
    printf("輸入查詢的字串:");
    scanf("%s",str2);
    printf("輸入替換的字串:");
    scanf("%s",str3);
    str_func(str1,str2,str3);
    /*4. 完成字串列印*/
    printf("str1=%sn",str1);
    return 0;
}


//"123A789"   ""
void str_func(char *str1,char *str2,char *str3)
{
    int str1_len=0;
    int str2_len=0;
    int str3_len=0;
    int i,j;
    int cnt=0;
    
    /*2. 計算長度*/
    str1_len=strlen(str1);
    str2_len=strlen(str2);
    str3_len=strlen(str3);
    /*3. 字串替換*/
    for(i=0;i<str1_len;i++)
    {
        //查詢字串
        for(j=0;j<str2_len;j++)
        {
            if(str1[i+j]!=str2[j])break;
        }
        //如果查詢成功就進行替換
        if(j==str2_len)
        {
            //總長度變短了
            if(str2_len>str3_len)
            {
                cnt=str2_len-str3_len; //差值
                //完成資料向前移動--覆蓋
                for(j=i+str2_len-cnt;j<str1_len;j++)
                {
                    str1[j]=str1[j+cnt];
                }
                str1[str1_len-cnt]='';
            }
            //總長度變長了
            else if(str2_len<str3_len)
            {
                cnt=str3_len-str2_len; //差值
                //完成資料向後移動
                for(j=str1_len;j>=i+str2_len;j--)
                {
                    str1[j+cnt]=str1[j];
                }
                str1[str1_len+cnt]='';
            }
            //替換
            for(j=0;j<str3_len;j++)
            {
                str1[i+j]=str3[j];
            }
            //重新計算長度
            str1_len=strlen(str1);
        }
    }
}

封裝函數: 清除二維陣列的指定行

該函數功能可以通過傳入的引數,清除指定二維陣列的指定一行資料為0.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void clear(int (*p)[5],int a,int b);
int main()
{
    int i,j;
    int buff[][5]=
    {
        {1,2,3,4,5},
        {11,12,13,14,15},
        {21,22,23,24,25}
    };
    printf("源資料:n");
    for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
    {
        for(j=0;j<sizeof(buff[0])/sizeof(buff[0][0]);j++)
        {
            printf("%d ",buff[i][j]);
        }
        printf("n");
    }
    
    clear(buff,888,2);
    
    printf("清除之後的資料:n");
    for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
    {
        for(j=0;j<sizeof(buff[0])/sizeof(buff[0][0]);j++)
        {
            printf("%d ",buff[i][j]);
        }
        printf("n");
    }
    return 0;
}

void clear(int (*p)[5],int a,int b)
{
    int i;
    for(i=0;i<sizeof(p[0])/sizeof(p[0][0]);i++)
    {
        p[b][i]=a;
    }
}

封裝函數:字串裡所有大寫字母互相替換

將字串裡所有大寫字母全部換成小寫字母。或者小寫字母全部換成大寫字母。可以通過形參進行區分。 該功能廣泛用在驗證碼功能上。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(char *str,int flag);
int main()
{
    char buff[100];
    printf("從鍵盤上輸入字串:");
    scanf("%s",buff);
    printf("源字串:%sn",buff);
    func(buff,0);
    printf("大寫轉換小寫:%sn",buff);
    func(buff,1);
    printf("小寫轉大寫:%sn",buff);
    return 0;
}

//函數功能: 大寫小寫轉換
//flag=0表示大寫轉換小寫  =1表示小寫轉大寫
void func(char *str,int flag)
{
    int data;
    while(*str!='')
    {
        if(flag)
        {
            if(*str>='a'&& *str<='z') //小寫
            {
                *str=*str-32;
            }
        }
        else
        {
            if(*str>='A'&& *str<='Z') //小寫
            {
                *str=*str+32;
            }
        }
        str++;
    }
}

封裝GPS解碼函數:可以傳入GPS格式的字串

該函數可以傳入GPS格式的字串,在函數裡完成所有資料解碼輸出。經度、緯度、衛星的數量、時間

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char gps_buff[]=
{
    "$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F"
    "$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D"
    "$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37"
    "$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A"
    "$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B"
    "$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C"
    "$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F"
    "$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62"
    "$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D"
    "$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14"
    "$GNZDA,114955.000,06,11,2017,00,00*47"
    "$GPTXT,01,01,01,ANTENNA OK*35"
};

/*
函數功能: 根據逗號位置提取資料
函數引數:
char *gps_src GPS源字串地址
char *buff 存放提取的資料
char *find_head 查詢的GPS資料頭
int cnt  逗號的偏移量
返回值:提取的位元組數。
*/
int GPS_GetData(char *gps_src,char *find_head,char *buff,int cnt)
{
    char *p;
    int number=0; //提取的數量
    int a=0;
    p=strstr(gps_src,find_head);
    if(p!=NULL)
    {
        //查詢逗號的位置
        while(*p!='')
        {
            if(*p==',')a++; //記錄逗號的數量
            if(a==cnt)break; //逗號找成功了
            p++;
        }
        p++; //跨過當前逗號
        //提取資料
        while(*p!='')
        {
            if(*p==',')break; //遇到逗號停止提取資料
            buff[number]=*p;
            p++;
            number++;
        }
        buff[number]='';
    }
    return number;
}

int main()
{
    char buff[100];
    GPS_GetData(gps_buff,"$GNGGA",buff,2);
    printf("緯度:%sn",buff);
    GPS_GetData(gps_buff,"$GNGGA",buff,4);
    printf("經度:%sn",buff);
    return 0;
}

封裝函數: 將十進位制整數轉為16進位制輸出(字串形式)

#include <stdio.h>
//定義16進位制的資料,方便輸出
char hex_val[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
int main() 
{ 
    int number=0;
    int a[100]; 
    int i=0; 
    int data; 
    /*1. 輸入十進位制的整數*/
    printf("輸入一個整數:"); 
    scanf("%d",&number); 
    /*2. 16進位制最大值是15-0xFF,取餘進行分離*/
    while(number>0) 
    { 
        data=number%16; 
        a[i]=data; 
        number=number/16; 
        i++;
    } 
    printf("輸入整數的十六進位制數: 0x"); 
    /*3. 輸出對應的16進位制格式*/
    for(i=i-1;i>=0;i--)
    {
        printf("%c",hex_val[a[i]]); 
    } 
    printf("n"); 
}

到此這篇關於C語言封裝函數位符串練習彙總分享的文章就介紹到這了,更多相關C語言字串內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com