字符串训练

1.题目: 请编写一个C函数,该函数将一个字符串逆序

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

void swap( char *str, int len )
{
    int i = 0;
    int temp = 0;
    for( i = 0; i < len / 2; i++ )
    {
        temp = str[i];                              //先将str[i]的值存到中间变量temp中
        str[i] = str[len - 1 - i];                  //再将和str[i]首尾对应的str[len - 1 - i]赋给str[i]
        str[len - 1 - i] = temp;                    //让str[len - 1 -i]等于temp
    }

}

int main()
{
    char str[100] = {0};
    int len = 0;

    printf("please input a string:");
    scanf("%s",str);                                //输入字符串

    len = strlen(str);                              //让len等于字符串的长度

    swap( str, len );                               //调用交换函数
    printf("%s\n",str);                             //输出交换后的字符串

    return 0;
}

2.题目: 请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出

#include<stdio.h>

int main()
{
    void fun( int num,char *str);                   //声明fun函数
    char str[100] = {0};
    int num = 0;

    printf("Please input a number:");
    scanf("%d",&num);                               //录入num的值

    fun(num,str);

    return 0;
}

void fun(int num,char *str)
{
    int i = 0;
    int j = 0;
    while( num != 0 )
    {
        i = num % 10 + '0';
        str[j++] = i;
        num /= 10;
    }                                               
    //从最低位开始将num中每一位取出加上字符'0'变成数字字符,存到str字符数组中
    while( j-- )
    {
        printf("%c",str[j]);
    }                                               //倒着输出字符数组str中的字符
    printf("\n");
}

3.题目: 输入一个字符串,计算字符串中子串出现的次数

#include <stdio.h>

void compare(char *str1, char *str2)
{
    int count = 0;
    char *p1 = NULL;
    char *p2 = NULL;                                    //定义p1 p2两个空指针
    p1 = str1;
    p2 = str2;                                          //将str1和str2两个字符串分别赋给p1 p2

    while(*p1 != '\0')
    {
        if(*p1 == *p2)
        {
            p1++;           
            p2++;                                       //当两个指针里的字符相等时,比较下一个字符
        }
        else
        {
            p1++;                                       //不相等时p1往后一个字符
        }
        if(*p2 == '\0')
        {
            count++;                                    //当p2到最后时代表p1中有和p2一样的字符,让count+1
            p2 = str2;                                  //让p2再次等于str2
        }
    }
    printf("%d\n",count);                               //输出count的值
}

int main()
{
    char str1[100] = {0};
    char str2[100] = {0};

    printf("please input the first string:\n");
    scanf("%s",str1);                                   //输入字符串str1
    printf("please input the second string:\n");
    scanf("%s",str2);                                   //输入字符串str2

    compare(str1,str2);                                 //调用compare函数

    return 0;
}

4.题目: 编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,及将句子中的单词位置倒置,而不改变单词内部结构.

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

void swap(char *str, int len)
{ 
    int i = 0;
    int temp = 0;

    for( i = 0; i < len / 2; i++)
    {
        temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }                                               //将字符串逆序
}

void str_convert(char *str, int len)
{
    int num = 0;
    swap(str, len);                                 //调用逆序函数,将整个字符串逆序

    while(*str != '\0')
    {
        if(*str == ' ' || *str == '\0')
        {
            swap(str - num, num);                   //遍历逆序后的字符串,如果碰到空格或者空,再逆序空格之前的单词
            str++;                                  //跳过空格
            num = 0;                                //让num清0
        }
        str++;
        num++;                                      //用来计算单词的长度
    }

    swap(str - num, num);                           //逆序最后的单词

}

int main()
{
    char str[] = {"im am from shanghai"};
    int len = strlen(str);
    printf("%s\n",str);                             //输出正常顺序的字符串

    str_convert(str,len);                           //调用倒置函数
    printf("%s\n",str);

    return 0;
}

5.题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧

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

int head_flag = 0;                                      //定义全局变量head_flag
int tail_flag = 0;                                      //定义全局变量tail-flag

char *head_find( char *str,char *head )
{
    char *head_temp = NULL;
    int head_count = 0;
    int head_len = strlen(head);

    while( *str != '\0' && !head_flag )                 //当字符串str不为空并且head_flag为0时进行循环
    {
        while( *str == *head )                          //当字符串str中有字符等于head中的字符时进行循环
        {
            str++;
            head++;
            head_count++;                               //一个字符相等head_count+1

            if( head_count == head_len )                //当head_count等于head字符串长度时
            {
                head_flag = 1;                          //让全局变量head_flag = 1
                head_temp = str - head_len;             //head_temp等于字符串str中head开始的位置
                break;
            }
        }
        str++;
    } 
    if( head_flag ==1 )         
    {
        return head_temp;                               //当head_flag == 1时,返回head_temp的值
    }
}

char *tail_find( char *str,char *tail )
{
    char *tail_temp = NULL;
    int tail_count = 0;
    int tail_len = strlen(tail);

    if( head_flag == 1 )                                //当head_flag = 1时代表字符串str中有head字符
    {
        while( str != '\0' && !tail_flag )              //当字符串str不为空并且tail_flag = 0时进行循环
        {
            while( *str == *tail )                      //当字符串str中有字符等于tail中的字符时进行循环
            {
                str++;
                tail++;
                tail_count++;                           //一个字符相等tail_count + 1

                if( tail_count == tail_len )            //当tail_count等于tail字符串长度时
                {
                    tail_flag = 1;                      //让全局变量tail_flag = 1
                    break;
                }
            }
            str++;
        }
        if( tail_flag ==1 )
        {
            return str - 1;                             //当tail_flag == 1时,返回str中tail结束的位置
        }
    }
}

void head_tail( char *str,char *head,char *tail )
{
    int i = 0;

    char *str_start = head_find( str,head );            //调用head_find函数,让str_start等于其返回值
    char *str_end = tail_find( str,tail );              //调用tail_find函数,让str_end等于其返回值
    int str_len = str_end - str_start;                  //让str_len等于str中从head开始到tail结束的长度

    printf("result is : ");

    for( i = 0; i < str_len; i++ )
    {
        printf("%c",*str_start);                        //从head开始的地方输出字符一直到tail结束的地方
        str_start++;
    }
    printf("\n");
}

int main()
{
    char *str = "sadheadhauboisoktail";
    char *head = "head";
    char *tail = "tail";

    printf("string is :%s\n",str);
    printf("head is :%s\n",head);
    printf("tail is :%s\n",tail);

    head_tail(str,head,tail);                           //调用head_tail函数

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值