我在网上看到了一个答案,并不了解它如何与该循环一起使用。为什么我的工作没有成功。问题是:编写 <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++;
}
}
答案 0 :(得分:0)
如果您调整实际代码,首先在s1
和s2
旁边循环,或者反过来是没关系的。
两个版本都存在问题: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
注意:
在else
,for
,while
,do ... while
和for
支持while
而非l
:对索引变量的初始化,增量和测试进行分组可提高可读性并减少错误。
避免使用恒定宽度字体命名变量1
:它看起来与const
太相似。
{{1}}限定未被函数修改的字符串参数。