C语言指针的入门编程训练

将以下练习题全用指针实现

1、把所有小写字母换成大写字母。(输入ABcDEfgH 输出 ABCDEFGH)

//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
        char *str = (char *)malloc(128);
        scanf("%s",str);
        char *begin = str;
        while(*str != '\0'){
                if(*str>97 && *str<122)
                        *str-=32;
                str++;
        }
        printf("%s\n",begin);
        free(begin);
        begin = NULL;
        return 0;
}

2、去掉字符串中的空格。(输入abcd ef g hijk 输出 abcdefghijk)

//代码参考
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void delete_space(char *str)
{
        while(*str != '\0')
        {
                  *str=*(str+1);
                  str++;
        }
}
int main()
{
        char *str = (char *)malloc(128);
        char ch;
        int i=0;
        while((ch=getchar()) != '\n'){
                *(str+i++)=ch;
        }
        char * begin = str;
        while(*str != '\0')
        {
                if(*str == ' ')
                {
                        delete_space(str);
                }
                else
                {
                        str++;
                }
        }
        printf("%s\n",begin);
        free(begin);
        begin = NULL;
        return 0;
}

3、判断一个字符串是不是回文。(输入abcdedcba)

//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
        char *str = (char *)malloc(128);
        char ch;
        static int i=0;
        while((ch = getchar()) != '\n')
        {
                *(str + i++) = ch;
        }
        /*********************************************
         *方法一
        char *begin = str;
        while(*begin != '\0')
        {
                if(*begin != *(str+ --i)){
                        printf("it is not\n");
                        return 0;
                }
                begin++;
        }
        printf("it is\n");
        **********************************************/
        // 法二
        int k=0;
        for(k=0;k<(i/2);k++){

                if(str[k] != str[i-k-1])
                {
                        printf("it is not\n");
                        return 0;
                }
        }
        printf("it is\n");
        free(str);
        str = NULL;
        return 0;
}

4、给定字符串A 和 B,输出A 和 B中的最大公共子串。(A = ‘aocdfe’ B=‘pmcdfa’ 输出’cdf’)

//参考代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *logest_comman_substring(char *str1, char *str2)
{
        int str1len = strlen(str1);
        int str2len = strlen(str2);
        int max=0;
        int num=0;
        int start;
        for(int i=0;i<str1len;i++)
                for(int j=0; j<str2len;j++)
                {
                        int start1 = i;
                        int start2 = j;
                        while((start1<=str1len-1) && (start2<=str2len-1)&&(str1[start1++] == str2[start2++]))
                                num++;
                        if(num>=max)
                        {
                                max = num;
                                start = i;
                        }
                        num=0;
                }
        char *str = (char *)malloc(max+1);
        strncpy(str,str1+start,max);
        str[max]='\0';
        return str;
}
int main()
{
        char *str = (char *)malloc(32);
        char *str1 = (char *)malloc(32);
        int i=0,j=0;
        char ch;
        printf("input A:");
        while((ch=getchar()) != '\n'){
                *(str + i++)=ch;
        }
        printf("input B:");
        while((ch=getchar()) != '\n'){
                *(str1 + j++)=ch;
        }
        printf("最大公共字串:");
        char* str2 = logest_comman_substring(str,str1);
        printf("%s\n",str2);
        free(str2);
        str2 = NULL;
        return 0;
}

5、编写一个C函数,将“I am from shanghai" 倒置为"shanghai from am I",即将句子中的单词位置倒置,而不改变单词内部结构。

//代码参考
#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
int main()
{
        char *str[SIZE]={0};
        int i;
        for(i=0;i<SIZE;i++)
        {
                str[i] = (char *)malloc(sizeof(char *) * 16);
                scanf("%s",str[i]);
        }
        char *tmp;
        for(i=0;i<SIZE/2;i++)
        {
                tmp = str[i];
                str[i] = str[SIZE-1-i];
                str[SIZE-1-i] = tmp;
        }
        for(i=0;i<SIZE;i++)
        {
                printf("%s ",str[i]);
                free(str[i]);
        }
        printf("\n");
        return 0;
}

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

//代码参考
#include<stdio.h>
#include<stdlib.h>
int main()
{
        char *str = (char *)malloc(128);
        scanf("%s",str);
        while(*str != '\0')
        {
                if(*str == 'h' && *(str+1) == 'e' && *(str+2) == 'a' && *(str+3) == 'd')
                {
                        char *begin = str;
                        while(*begin != '\0')
                        {
                                if(*begin == 't' && *(begin+1) == 'a' && *(begin+2) == 'i'&& *(begin+3) == 'l')
                                {
                                        while( !((str+1)==(begin+5)))
                                        {
                                                printf("%c",*str);
                                                str++;
                                        }
                                        *begin = '\0';
                                }
                                begin++;
                        }

                }
                str++;
        }
        putchar('\n');
        return 0;
}

7、找出字符串中第一个不重复的字符。(如输入google,输出l,l是第一个不重复的字符)

//代码参考
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        char *str = (char *)malloc(32);
        scanf("%s",str);
        int len=strlen(str);
        int i,j;
        for(i=0;i<len;i++)
        {
                for(j=0;j<len;j++)
                {
                        if(str[i] == str[j] && i != j)
                        {
                                break;
                        }
                }
                if(j == len)
                {
                        printf("%c\n",str[i]);
                        break;
                }
        }
        return 0;
}

8、向左旋转字符。(输入XYZabcdef 3,输出abcdefXYZ, 及字符串向左移动三位,前面的接到后面)

//代码参考
//代码参考
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        int num,i=0;
        char *str = (char *)malloc(32);
        char *tmp = (char *)malloc(32);
        scanf("%s",str);
        scanf("%d",&num);
        int len = strlen(str);
        int j=0;
        char *start = str;
        while(*str != '\0')
        {
                if(i<num)
                {
                        tmp[i] = *(str+len-num);
                        *(str+len-num)=*str;
                }else{
                        if(*str == 'X' || *str == 'Y' || *str == 'Z')
                        {
                                *(str-num) = tmp[j];
                                j++;
                        }else
                        {
                                *(str-num)    =*str;
                        }
                }
                i++;
                str++;
        }
        printf("%s\n",start);
        free(start);
        return 0;
}

结语:
以上内容都是由个人整理,有问题的话,欢迎留言指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值