C语言:利用指针编写程序,从键盘输入一个字符串,删除该字符串的所有首部和尾部数字字符,输出修改后的字符串以及该字符串的长度

题目来源:大工慕课 链接
作者:Caleb Sung

题目要求

利用指针编写程序,从键盘输入一个字符串,删除该字符串的所有首部和尾部数字字符,输出修改后的字符串以及该字符串的长度。
举例:输入的字符串为12abcd34,删除首部和尾部数字字符后字符串变成abcd,长度为4


分析与参考解答

删除该字符串的所有首部和尾部数字字符这一步操作我分为了两个函数,因为删除首部和尾部的数字字符的操作逻辑有所不同:

1. 删除前部数字字符的函数delHead()

这里我假设指定一个指针p,从字符串的第一个字符往后走:

  1. 检查当前字符是不是数字字符,如果是则执行步骤2;
  2. 把p所在位置之后的所有的字符分别提前一位,这样就把p原有的数字字符用下一个字符覆盖掉了;
  3. 因为执行了上一操作之后最后一个和倒数第二个字符重复了,最后一个字符应该被删掉使字符串长度-1;
  4. 检查p+1位置的字符是否是数字字符,如果是则继续循环,如果否则跳出循环

值得注意的是,如果字符串第一个字符就是数字,那么经过上述处理之后指针p仍然应当从字符串的第一个字符开始从前往后走,因为原来的第一个数字字符已经被下一个字符覆盖掉了,而如果使指针p直接检查下一字符的话则相当于跳过了原字符串的第二个字符,并以此类推,若字符串前部数字字符有连续多个则将导致这些数字字符删除不完全。
故而我们写出:

void delHead(char *ch){
    char *p, *q;
    for(p=ch; ;){
        if(*p>='0'&&*p<='9'){
            for(q=p; q<=ch+strlen(ch)-1; q++){
                *q = *(q+1);
            }
            *(ch+strlen(ch)) = '\0';
            if(*p<'0'||*p>'9'){
                break;
            }
        }
        break;
    }
}

2. 头文件

因为用到了strlen(),因而必须引用string.h

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

3. 删除尾部数字字符的函数delTail()

这个函数的逻辑与删除前部数字字符的函数delHead()相似,不过更为简单:这个函数不需要当p发现当前位置字符为数字字符时调整所有字符的位置——只需要将当前位置的内容变成'\0'并继续向前执行相同操作就可以了,直到发现前一个字符不是数字字符为止:

void delTail(char *ch){
    char *p;
    int n;
    for(p=ch+strlen(ch); ; p--){
        if(*p>='0'&&*p<='9'){
            *p = '\0';
            if(*(p-1)<'0'||*(p-1)>'9'){
                break;
            }
        }
        break;
    }   
}

4. 主函数

没什么说的:

void main(){
    char ch[100];
    printf("输入一个字符串,程序将删除字符串首尾的数字字符:\n");
    scanf("%s", ch);
    delHead(ch);
    delTail(ch);
    printf("\n处理后的字符串:\n%s", ch);
    printf("\n字符串长度为:%d", strlen(ch));
}

运行效果

输入一个字符串,程序将删除字符串首尾的数字字符:
123456asdf123456

处理后的字符串:
asdf
字符串长度为:4

猜你喜欢

转载自blog.csdn.net/qq_41933331/article/details/80233740