• 牛客网C语言刷题(指针篇)


    ✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
    📃个人主页:嵌入式基地
    🔥系列专栏:C语言刷题专栏

    习题一:获取字符串长度

    描述

    • 键盘输入一个字符串,编写代码获取字符串的长度并输出,要求使用字符指针实现。

    输入描述

    • 键盘输入一个字符串

    输出描述

    • 输出字符串的长度

    示例

    输入:
    helloworld
    输出:
    10
    
    • 1
    • 2
    • 3
    • 4

    解析

    • 定义一个指针指向字符串开头。
    • 只要指针对应元素不是’\n’,将指针后移,同时长度加1。

    代码实现

    #include 
    using namespace std;
    
    int main() {
    
        char str[100] = { 0 };
        cin.getline(str, sizeof(str));
    
        int len=0;
        char *p=str;
        //只要指针没有指向换行符位置
        while(*p!='\0'){
            //长度加1,指针p后移
            len++;
            p++;
        }
        cout<<len<<endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    习题二:复制部分字符串

    描述

    • 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。

    输入描述

    • 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len)

    输出描述

    • 输出复制的新字符串

    示例

    输入:
    helloworld
    6
    输出:
    world
    
    • 1
    • 2
    • 3
    • 4
    • 5

    解析

    题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个’\0’表示字符串的结束,如果长度小于数组长度,输入所有字符后加’\0’,如果长度大于数组长度,截断输入的前面部分再在最后加’\0’。

    我们准备一个新串来保存复制后的字符串,因为原串大小不会超过30,因此新串的大小也不会超过30.

    题目要求使用指针,我们可以用两个指针,指针p一开始指向原串的第m个位置,指针q一开始指向新串的起始位置。然后利用指针p遍历原串,到末尾的’\0’结束,遍历过程中像指针q指向的地址复制指针p指向元素的值,然后指针同步后移。

    代码实现

    #include 
    using namespace std;
    
    int main() {
    
    	char str[30] = { 0 };
    	cin.getline(str, sizeof(str));
        int m;
    	cin >> m;
    	// write your code here......
        char copystr[30] = { 0 };
        char* p = str + m - 1; //指向字符数组第m个元素
        char* q = copystr;
        while(*p != '\0'){ //直到字符串结果
            *q = *p; //复制
            p++;; //两边指针都后移
            q++;
        }
        cout << copystr << endl;
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    习题三:编写函数实现两数交换(指针方式)

    描述

    • 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。

    输入描述

    • 键盘输入2个整数 m 和 n

    输出描述

    • 输出交换后m 和 n 的值,中间使用空格隔开

    示例

    输入:
    2
    3
    输出:
    3 2
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码实现

    using namespace std;
    
    // write your code here......
    void swap(int *p, int *q);
    void swapp(int &a, int &b);
    
    int main() {
    
        int m, n;
        cin >> m;
        cin >> n;
    
        // write your code here......
    //     swap(m,n); // 指针变量
        swapp(m,n);  //引用变量
    
        cout << m << " " << n << endl;
    
        return 0;
    }
    void swap(int *p, int *q)
    {
        int temp = *p;
        *p = *q;
        *q = temp;
    }
    void swapp(int &a, int &b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    习题四:利用指针遍历数组

    描述

    • 键盘随机输入 6 个整数,将这些数据保存到数组中,利用指针遍历数组中的元素并打印。

    输入描述

    • 键盘随机输入 6 个整数

    输出描述

    • 输出数组中的所有元素,每个元素中间使用空格隔开
    • 例如:10 20 30 40 50 60

    示例

    输入:
    10
    20
    30 
    40
    50
    60
    
    输出:
    10 20 30 40 50 60
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    解析

    • 利用指针遍历数组, 数组名就是数组第一个元素的地址
    • 因此将地址范围知道,就可以访问每一个元素的值
    • 这里的指针4个字节(64位的话8个字节)作为一整块

    代码实现

    #include 
    using namespace std;
    
    int main() {
    
        int arr[6] = { 0 };
        int* ptr = arr;
    
        int len = sizeof(arr) / sizeof(int);
    
        for (int i = 0; i < len; i++) {
            cin >> arr[i];
        }
    
        for (ptr ; ptr < arr + len ; ptr++)
        {
            cout <<  *ptr<< " ";
        }
        
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    习题五:牛牛的新数组求和

    描述

    • 牛牛学习了指针相关的知识,想实现一个 int cal(int *array,int n) 的函数求出长度为 n 的数组的和。

    输入描述

    • 第一行输入一个正整数 n ,表示数组的长度
    • 第二行输入 n 个正整数,表示数组中每个数字的值

    输出描述

    • 实现 int cal(int *array,int n) 求出数组array的和

    示例

    输入:
    5
    2 8 1 9 5
    
    输出:
    25
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码实现

    #include 
    using namespace std;
    
    int cal(int *array,int n){
        int *p = array;
        int sum=0;
         for(int i=0;i<n;i++){
           sum+=*p;
             p++;
           }
       
        return sum;
    
    }
    
    int main(){ 
        int n=0;
        cin>>n;
        int array[n];
        for(int i=0;i<n;i++){
            cin>>array[i];
        }
        cout<<cal(array,n);
       
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    习题六:牛牛的排序

    描述

    • 牛牛试图给一个长度为 n 整数数组排序,即实现一个 void sort(int *array,int n)

    输入描述

    • 第一行输入一个正整数 n ,表示数组长度。
    • 第二行输入 n 个正整数,表示数组中每个元素的值

    输出描述

    • 输出排序后的数组

    示例

    输入:
    5
    2 9 8 1 3
    
    输出:
    1 2 3 8 9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码实现

    #include
    void sort (int*arr,int n)    //冒泡排序
    {
        int i,j=0;
        for(i=0;i<n-1;i++)
        {
            for(j=0;j<n-1-i;j++)
            {
                if(arr[j]>arr[j+1])
                {
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }   
            }
        }
        for(i=0;i<n;i++)
        {
            
            printf("%d ",arr[i]);
        }
        
        
    }
    int main()
    {
        int n,i=0;
        scanf("%d",&n);
        int arr[100]={0};
        for(i=0;i<n;i++)
        {
            scanf("%d",&arr[i]);
        }
        sort(arr,n);
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    搭建Redis集群
    mysql精简单机版,免登录,可复制,不启动服务,与本机mysql无冲突
    Ansible初识、提高小记(基于CentOS7.5,附带实验源文件)
    【vscode新建文件设置默认代码以C语言为例】
    kicad源代码研究:symbol properties窗口中为SCH_SYMBOL添加或删除一个sch_field
    2023-简单点-树莓派安装ncnn框架
    C++模板编程(15)---模板解析(Parsing Templates)
    解决ubuntu终端能不能正常显示中文
    李宏毅2022机器学习HW4 Speaker Identification上(Dataset &Self-Attention)
    奋进新时代 和数SaaS开启下一个波澜壮阔科技新世界
  • 原文地址:https://blog.csdn.net/m0_51061483/article/details/126594251