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

简介: 牛客网C语言刷题(指针篇)

习题一:获取字符串长度


描述


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


输入描述


  • 键盘输入一个字符串


输出描述


  • 输出字符串的长度


示例


输入:
helloworld
输出:
10


解析


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


代码实现

#include <iostream>
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;
}

习题二:复制部分字符串


描述


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


输入描述


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


输出描述


  • 输出复制的新字符串


示例

输入:
helloworld
6
输出:
world

解析


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


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


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


756c50712f7148bc9d82da538fad6ae9.png


代码实现

#include <iostream>
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;
}

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


描述


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


输入描述


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


输出描述


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


示例

输入:
2
3
输出:
3 2

代码实现

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;
}


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


描述


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


输入描述


  • 键盘随机输入 6 个整数


输出描述


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


示例

输入:
10
20
30 
40
50
60
输出:
10 20 30 40 50 60


解析


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


代码实现


#include <iostream>
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;
}


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


描述


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


输入描述


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


输出描述


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


示例


输入:
5
2 8 1 9 5
输出:
25

代码实现

#include <iostream>
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;
}


习题六:牛牛的排序


描述


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


输入描述


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


输出描述


  • 输出排序后的数组


示例

输入:
5
2 9 8 1 3
输出:
1 2 3 8 9

代码实现


#include<stdio.h>
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;
}


结束语


你想要的牛客都有,各种大厂面试真题在等你哦!快快通过下方链接注册加入刷题大军吧!

💬刷题神器,从基础到大厂面试题👉点击跳转刷题网站


8a3149e909534ca2b9a134ac1b535448.png


相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
52 0
|
10天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
58 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
10天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
34 9
|
10天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
32 7
|
20天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
81 12
|
13天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
13天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
43 3
|
14天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
20天前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
42 10
|
13天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
29 1