指针用的不熟,不会做

img


大一的实验课,指针不会用,编函数也不是很熟,没思路,希望得到点指点,

只需要将被删除的字符串后的字符都向前移动被删除字符串长度位置就可以了

#include <stdio.h>

char * str_delete(char *s,int v,int w)
{
    if(v<1 || w<0)
        return s;
    char *p = s,*q;
    int i = 0;
    while(i<v-1 && s[i] != 0)
    {
        p++;
        i++;
    }
    if(s[i] == 0)
        return s;
    q = p;
    while(q-p<w && s[i] != 0)
    {
        i++;
        q++;
    }
    if(s[i] == 0)
    {
        *p = 0;
        return s;
    }
    do
    {
        *p = *q;
        p++;
    }while(*q++ != 0);
    return s;
}

int main()
{
    char a[100];
    int v,w;
    gets(a);
    scanf("%d %d",&v,&w);
    char *p = str_delete(a,v,w);
    printf("%s\n",p);
    return 0;
}

1、首先需要明白指针的本质是什么。可以看看我的这篇文章https://blog.csdn.net/Black_vv/article/details/120419017
说到指针,离不的就是地址这个概念。地址: 系统把内存以一个字节为单位划分成许多份进行编号,这个编号就是内存单元中的地址。在C语言中,指针的概念与地址差不多,你可以认为指针就是有类型的地址。一个变量的首地址称为该变量的指针。它标志着变量的内容从哪里开始。
2、回到题目,char * str_delete(char s,int v,int w),这是一个函数。函数就是完成某一个功能的指令序列的封装。函数由: 返回值类型 函数名(参数),组成。char 就是这个名为str_delete这个函数的返回值,也就是return的东西。char* s就是函数的第一个参数,意思是需要传如函数的数据。v,w为字符串的下标。char* s这个字符串可以理解为char s[数组的size],这样一个装着很多个字符的数组,例如char* s = "123456";等价于char s1[7]={'1','2','3','4','5','6','\0'};


#include<stdio.h>
char*str_delete(char*s, int v, int w)
{
    for (int i = v; i <= w && s[i + w-1]; i++)
        s[i] = s[i + w];
    s[v + w] = '\0';
    return s;
}
int main()
{
    char s[]= "1234567";
    printf("%s",str_delete(s, 1, 3));
    return 0;
}
#include<stdio.h>
#include<string.h>
char * str_delete(char *s, int v, int w)
{
    int len = strlen(s);
    if (v > 0 && w > 0 && (v -1 + w) <= len)
    {
        //要删除的w个字符,把原字符串s分成三段“左侧剩余,删除字符串,右侧剩余”
        int i = v - 1;    //被删除的字符串开头序号
        char *p = s + i + w;    //指向右侧剩余字符串的首字符
        //把p指向的字符逐一放到被删除字符的位置,直到p指向字符串s的结尾\0处
        for(;*p;i++,p++)
            s[i] = *p;
        s[i] = 0;
    }
    printf("%s\n", s);
    return s;
}