鱼C论坛

 找回密码
 立即注册
查看: 1529|回复: 4

[已解决]字符数组问题

[复制链接]
发表于 2019-9-24 23:23:21 | 显示全部楼层 |阅读模式
10鱼币
【问题描述】

  编写程序将一行英文中指定的字符串删除后输出。注意:查找指定字符串时,大小写无关,而且有可能多次出现。

【输入形式】

  先从标准输入中输入一指定字符串(其长度不超过20,该字符串中不会出现空格),然后在下一行输入一行英文(长度不超过200),行末有回车换行。

【输出形式】

  将输入的英文删除指定字符串后输出到标准输出上,末尾应有一个回车换行;若删除后英文为空,则只输出一个回车换行。

【样例1输入】

  th
  This second edition of "The C Programming Language" describes C as defined by the ANSI standard. Modern compilers already support most features of the standard.

【样例1输出】

  is second edition of "e C Programming Language" describes C as defined by e ANSI standard. Modern compilers already support most features of e standard.

【样例2输入】

  This
  THIS

【样例2输出】



【样例说明】

  样例1中输入的指定字符串为th,由于是大小写无关查找删除,所以下一行英文信息中有四个子串要删除:Th、Th、th和th,删除后其它信息原样输出。
  样例2中输入的指定字符串为This,输入的英文信息为THIS,大小写无关查找删除后英文信息为空,所以只输出了一个回车换行。

【评分标准】该题要求编程实现指定字符串的大小写无关查找删除,提交程序文件名为exam2.c或exam2.cpp。

  这题目应该怎么去做呀?没有头绪。
最佳答案
2019-9-24 23:23:22
本帖最后由 jackz007 于 2019-9-25 10:32 编辑

      楼主测试一下这个代码:
#include <stdio.h>
#include <string.h>

main(void)
{
        char s1[256] , s2[256] , s3[256]                     ;
        int c , k , m , n                                    ;
        fflush(stdin)                                        ;     // 获取键盘输入前,清空键盘缓冲区
        for(k = 0 ; (s1[k] = getchar()) != '\n' ; k ++)      ;     // 从键盘读取字符输入并存入 s1,直到按下回车键
        s1[k] = '\0'                                         ;     // 用字符串结束标志覆盖字符串 s1 末尾的回车字符 '\n'
        fflush(stdin)                                        ;     // 获取键盘输入前,清空键盘缓冲区
        for(k = 0 ; (s2[k] = getchar()) != '\n' ; k ++)      ;     // 从键盘读取字符输入并存入 s2,直到按下回车键
        s2[k] = '\0'                                         ;     // 用字符串结束标志覆盖字符串 s2 末尾的回车字符 '\n'
        m = strlen(s1)                                       ;     // 取得字符串 s1 长度
        n = strlen(s2)                                       ;     // 取得字符串 s2 长度
        if(n >= m && m > 0) {                                      // 如果 s2 长度大于等于 s1 ,并且,s1 不为空
                c = k = 0                                    ;     // 初始化临时变量
                while(k < n) {                                     // 以循环变量 k 为索引,遍历 s2 中的每个字符
                        if(k <= n - m) {                           // 如果当前 s2 中剩余字符数大于等于 s1
                                if(! strnicmp(s1 , & s2[k] , m)) { // 从 s2 索引 k 开始,提取 m 个字符,与 s1 忽略大小写比较
                                        k += m               ;     // 如果两个字符串相同,则直接丢弃 s2 中当前 m 个字符
                                } else {
                                        s3[c ++] = s2[k ++]  ;     // 否则,把 s2[k] 添加到 s3 中 
                                }
                        } else {
                                s3[c ++] = s2[k ++]          ;     // s2 中剩余字符少于 s1,直接把 s2[k] 添加到 s3
                        }
                }
                s3[c] = '\0'                                 ;     // 最后,为 s3 添加字符串结束标志
        }
        printf("%s\n" , s3)                                  ;
}

最佳答案

查看完整内容

楼主测试一下这个代码:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 23:23:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-9-25 10:32 编辑

      楼主测试一下这个代码:
#include <stdio.h>
#include <string.h>

main(void)
{
        char s1[256] , s2[256] , s3[256]                     ;
        int c , k , m , n                                    ;
        fflush(stdin)                                        ;     // 获取键盘输入前,清空键盘缓冲区
        for(k = 0 ; (s1[k] = getchar()) != '\n' ; k ++)      ;     // 从键盘读取字符输入并存入 s1,直到按下回车键
        s1[k] = '\0'                                         ;     // 用字符串结束标志覆盖字符串 s1 末尾的回车字符 '\n'
        fflush(stdin)                                        ;     // 获取键盘输入前,清空键盘缓冲区
        for(k = 0 ; (s2[k] = getchar()) != '\n' ; k ++)      ;     // 从键盘读取字符输入并存入 s2,直到按下回车键
        s2[k] = '\0'                                         ;     // 用字符串结束标志覆盖字符串 s2 末尾的回车字符 '\n'
        m = strlen(s1)                                       ;     // 取得字符串 s1 长度
        n = strlen(s2)                                       ;     // 取得字符串 s2 长度
        if(n >= m && m > 0) {                                      // 如果 s2 长度大于等于 s1 ,并且,s1 不为空
                c = k = 0                                    ;     // 初始化临时变量
                while(k < n) {                                     // 以循环变量 k 为索引,遍历 s2 中的每个字符
                        if(k <= n - m) {                           // 如果当前 s2 中剩余字符数大于等于 s1
                                if(! strnicmp(s1 , & s2[k] , m)) { // 从 s2 索引 k 开始,提取 m 个字符,与 s1 忽略大小写比较
                                        k += m               ;     // 如果两个字符串相同,则直接丢弃 s2 中当前 m 个字符
                                } else {
                                        s3[c ++] = s2[k ++]  ;     // 否则,把 s2[k] 添加到 s3 中 
                                }
                        } else {
                                s3[c ++] = s2[k ++]          ;     // s2 中剩余字符少于 s1,直接把 s2[k] 添加到 s3
                        }
                }
                s3[c] = '\0'                                 ;     // 最后,为 s3 添加字符串结束标志
        }
        printf("%s\n" , s3)                                  ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-25 07:07:22 | 显示全部楼层
jackz007 发表于 2019-9-24 23:23
楼主测试一下这个代码:

谢谢!结果是对的,但还是有点看不懂能否给个注释呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-25 11:29:42 | 显示全部楼层
来学习共进步 发表于 2019-9-25 07:07
谢谢!结果是对的,但还是有点看不懂能否给个注释呀?

      已经加上了详细注释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-25 22:35:22 | 显示全部楼层
jackz007 发表于 2019-9-24 23:23
楼主测试一下这个代码:

学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表