基础不扎实的计算机小白 2021-11-08 01:39 采纳率: 100%
浏览 224
已结题

关于使用strcpy函数删除字符串元素的问题

上图:

img

代码:


#include <stdio.h>
#include<string.h>//加了这个才能用 strlen 和 strcpy

int main() {
    char s[] = "qsds144.6,EXO";//题目字符串s
    int i, L;//i用来遍历确定元素的位置
             //L用来记录字符串的长度

    printf("处理前的字符串: %s\n", s);

    L = strlen(s);//添加头文件string.h 用strlen函数判断字符串s的长度并赋值给L

    for (i = L - 1; i >= 0; i--) {//L-1的意思:因为字符串是从0开始读起,所以L是长度,长度-1那么就是s的最后一个元素
        if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))//所以这个语句就是判断位置i,及最后一个元素的位置是否是字母
            strcpy(s + i, s + i + 1);//strcpy语句的用法strcpy(1,2)把 字符串元素2 复制给 字符串元素1
                                     //当i是最后一个元素的位置是i+1就是'\0',那么s+i就是元素O,那么s+i+1就是'\0'
                                     //所以当if判断到s+i是字母的话,就将s+i+1复制给s+i,这样以来原本的元素O就会被'\0'顶替掉,相当于删除掉
                                     //然后继续循环 i--就来到了倒数第二个元素继续上面的判断操作,如果不是字母的话就不顶替掉,继续判断倒数第三个位置
    }

    printf("处理后的字符串: %s\n", s);//输出整个字符串用%s格式
    return 0;
}

问题描述:
strcpy(1,2)就是把2赋值给1
那么最后得出的结果为什么不是:1111144.6,而是144.6,呢?他不是复制覆盖吗?

  • 写回答

2条回答 默认 最新

  • 我叫RT 2021-11-08 03:23
    关注

    你代码逻辑有问题。判断语句写的是,如果 s[i] 字母,则把该位置的下一个字符覆盖到当前位置。


    abcd111EFH

    这个字符串在处理最后一个字符 ‘H’时,判断当前符合要求,则把 H 之后的'\0'结尾字符串覆盖到该位置。原串变为 abcd111EF


    同理,在 abcd111 字符串处理时,由于数字 1 不是英文字母,则跳过。那么第一个命中 if 的是字母 d 。此时将 d 后面的覆盖到当前位置,那么原串变为 abc111

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 创建了问题 11月8日

悬赏问题

  • ¥15 overleaf中论文编辑,报错`pages' is a missing field, not a string, for entry 4
  • ¥15 vhdl+MODELSIM
  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么