首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何完成K&R练习2-4?

如何完成K&R练习2-4?
EN

Stack Overflow用户
提问于 2009-01-07 09:44:19
回答 6查看 2.4K关注 0票数 2

我正在学习如何使用k&r书(C编程语言)用C语言编写程序,其中一个练习我遇到了问题。它要求我检测并删除字符串s1中的一个字符,该字符与字符串s2中的任何字符都匹配。

所以,假设s1 = "A";

和s2 = "AABAACAADAAE“

我希望它返回"BCDE“

我知道我正走在正确的道路上,我只是不知道如何很好地设计程序,你能给我任何额外的提示吗?我试着阅读有关二叉树算法的文章,但我觉得对于这个平凡的任务来说,它有点太高级了。

谢谢大家!

代码语言:javascript
复制
/* An alternate version of squeeze(s1, s2) that deletes each character in
 * s1 that matches any character in the string s2
 *
 * Angie@odfx.org
 */

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

void squeeze(char s[], char t[]);

char string[] = "BAD";
char sstring[] = "ABC";

int
main(void)
{
    squeeze(string, sstring);
    return 0;
}

void
squeeze(char s[], char t[])
{
    int i, j, d;

    d = 0;
    if(strstr(s, t) == NULL)
        printf("%c", s[i]);
    s[j] = '\0';
}
EN

回答 6

Stack Overflow用户

发布于 2009-01-07 02:08:29

很棒的书。如果我是您,我会完全按照2.8节中的squeeze()进行操作,但不会进行直接比较(si != c),而是编写并利用一个函数

代码语言:javascript
复制
 int contains(char s[], int c)

如果字符串s包含c,则返回1,否则返回0。从简单的方法开始;当它起作用时,您可以使用更复杂的解决方案(二进制搜索,但请注意,该问题不要求s2中的字符按特定顺序)来提高性能。

票数 3
EN

Stack Overflow用户

发布于 2009-01-07 02:11:36

二分搜索对于这一点来说有点过头了。您需要三个索引。一个索引(i)用于遍历s,一个索引(k)用于遍历t,还有一个索引(j)用于跟踪字符在s中的位置,因为这些字符不在t中。因此,对于s中的每个字符,检查并查看它是否在t中。如果不是,则将其保存在s中。

代码语言:javascript
复制
void squeeze(char *s, char *t) {
    int i, j, k;
    int found = 0;

    for(i = j = 0; s[i] != '\0'; i++) {
        found = 0;
        for(k = 0; t[k] != '\0' && (found == 0); k++) {
            if(t[k] == s[i]) {
                found = 1;
            }
        }

        if(found == 0) {
            s[j++] = s[i];
        }

    }

    s[j] = '\0';
}
票数 2
EN

Stack Overflow用户

发布于 2009-01-07 02:00:06

你不需要花哨的二进制搜索来完成这项工作。您需要的是一个double for循环,它检查一个字符串中每个字符在另一个字符串中的出现情况,并将没有出现的字符复制到第三个字符数组中(这就是您的结果)。

代码可能如下所示(未经过测试!):

代码语言:javascript
复制
char *s1, *s2, *result; /* original strings and the result string */
int len1, len2; /* lengths of the strings */
for (i = 0; i < len1; i++) {
   for (j = 0; j < len2; j++) {
     if (s1[i] == s2[j]) {
       break;
     }
   }
   if (j == len2) {  /* s1[i] is not found in s2 */
     *result = s1[i]; 
     result++; /* assuming your result array is long enough */
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/418894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档