C编程语言练习2-4:我不明白答案

时间:2016-11-05 20:12:19

标签: c loops

我在网上看到了一个答案,并不了解它如何与该循环一起使用。为什么我的工作没有成功。问题是:编写 <tr ng-repeat="item in $data track by item.id" item-navigation item-id="item.id"> <td class="no-redirect">I dont want my directive to work here</td> <td>I want my directive to work here</td> <td>I want my directive to work here</td> <td class="no-redirect">I dont want my directive to work here</td> <td>I want my directive to work here</td> <td>I want my directive to work here</td> </tr> 的替代版本,删除字符串squeeze(s1,s2)中与字符串s1中的任何字符匹配的每个字符。 我认为它应检查s2中与s1中的每个字符都不匹配的每个字符。就像您在s2中看到一个字符一样,您循环浏览s1以查看它是否与s2中的字符匹配,然后转到s1中的下一个字符。因此s1的外部循环和s1的内部循环。 这是他的代码,我把它放在一个完整的代码中来测试它。他的输出是正确的。他的代码是功能部分。我不明白为什么他把s2置于外部循环中甚至可以工作。

s2

而且是我的。我把S2放在内码中,它的输出是hllo meow meow princess ..

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

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

void squeeze2(char s[], char t[]) {
    int i, j, k;
    for (k = 0; t[k] != '\0'; k++) {
        for (i = j = 0; s[i] != '\0'; i++)
            if (s[i] != t[k])
                s[j++] = s[i];
        s[j] = '\0';
    }
}

int main() {
    char s1[] = "hello meow meow princess";
    char s2[] = { 'a', 'e', 'm' };
    squeeze2(s1, s2);
    int i = 0;
    while (s1[i] != '\0') {
        printf("%c", s1[i]);
        i++;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您调整实际代码,首先在s1s2旁边循环,或者反过来是没关系的。

两个版本都存在问题:s2中的字符串main未终止(它不是C字符串),因此squeeze中的行为未定义为第二个字符串中的字符将被取消引用,超出数组的末尾。

您的版本中存在更多问题:

  • 如果在s1中找到一个或多个字符,如果缩短s2,则不会终止s1
  • 算法已被破解:您复制s2的每个字符的次数与找到与s2不匹配的字符的次数相同。

您应该通过调用strchr(s2, s1[i])或手动枚举来验证#include <string.h> #include <stdio.h> void squeeze(char *s1, const char *s2); int main(void) { char s1[] = "hello meow meow princess"; char s2[] = { 'a', 'e', 'm', '\0' }; squeeze(s1, s2); printf("%s\n", s1); return 0; } void squeeze(char *s1, const char *s2) { int i, j, k; for (i = k = 0; s1[i] != '\0'; i++) { for (j = 0; s2[j] != '\0'; j++) { if (s1[i] == s2[j]) break; } if (s2[j] == '\0') { // character was not found in s2 s1[k++] = s1[i]; } } s1[k] = '\0'; // null terminate s1 of it was shortened } 中是否存在该字符。

以下是更正后的简化版本:

if

注意:

  • elseforwhiledo ... whilefor

    之后,始终使用大括号进行非平凡的陈述
  • 支持while而非l:对索引变量的初始化,增量和测试进行分组可提高可读性并减少错误。

  • 避免使用恒定宽度字体命名变量1:它看起来与const太相似。

  • {{1}}限定未被函数修改的字符串参数。