这是我的教授参加的一次考试中的一项练习,我无法理解。我认为这与比较字符数组有关,但这似乎不仅仅如此。
#include <stdio.h>
int f (char s[], char t[]) {
int i, j;
for (i=0; s[i] !='\0'; i++)
for (j=0; t[j] !='\0'; j++)
if (s[i]==t[j]) return i;
return -1;
}
int main (void) {
char a[] ="estate";
char b[] ="vacanze";
char c[] ="esame";
char d[] ="onda";
char e[] ="surf";
printf ("Call result: %d\n", f(a, b));
printf ("Call result: %d\n", f(a, c));
printf ("Call result: %d\n", f(a, d));
printf ("Call result: %d\n", f(d, e));
return 0;
}
答案 0 :(得分:2)
函数f
对2个字符串进行逐字符比较。它不是strcmp
,因为索引i
和j
不会同时前进(即,它不只是将s[0]
与t[0]
,s[1]
进行比较t[1]
等)
仔细查看嵌套循环。对于每个j
的值,i
循环遍历第二个字符串中的所有位置,该循环遍历第一个字符串中的位置。
一旦找到匹配的字符,函数就会返回。
因此,如果s[0]
与t
中的任何字符匹配,将返回0
。
如果s[0]
与t
中的任何字符都不匹配,但是s[1]
与t
中的某些字符匹配,则会返回1
。
以此类推。返回的是s
中第一个字符与t
中的任何字符匹配的索引。
如果2个字符串没有共同的字符,则返回末尾的-1
。
除了-1
大小写和返回类型外,此函数与strcspn
相同。
由于数组索引运算符是指针算术的一种形式,因此代码中已经有很多指针算术。
出于考试要点而忽略该异议,一种重写该异议的方法如下:
/* Step 1: replace foo[bar] with *(foo+bar) */
int f1 (char s[], char t[]) {
int i, j;
for (i=0; *(s+i) !='\0'; i++)
for (j=0; *(t+j) !='\0'; j++)
if (*(s+i)==*(t+j)) return i;
return -1;
}
/* Step 2: introduce new loop variables p and q. Every time the original
code modifies i and j, you modify p and q so that p==s+i and q==t+j. */
int f2 (char s[], char t[]) {
int i, j;
char *p, *q;
for (i=0,p=s; *(s+i) !='\0'; i++,p++)
for (j=0,q=t; *(t+j) !='\0'; j++,q++)
if (*(s+i)==*(t+j)) return i;
return -1;
}
/* Step 3: Replace s+i with p and t+j with q. Replace i with p-s. These
are correct because of the work you did in step 2. */
int f3 (char s[], char t[]) {
int i, j;
char *p, *q;
for (i=0,p=s; *p !='\0'; i++,p++)
for (j=0,q=t; *q !='\0'; j++,q++)
if (*p==*q) return p-s;
return -1;
}
/* Step 4: Get rid of i and j. You're not using them any more. */
int f4 (char s[], char t[]) {
char *p, *q;
for (p=s; *p !='\0'; p++)
for (q=t; *q !='\0'; q++)
if (*p==*q) return p-s;
return -1;
}
答案 1 :(得分:1)
这是一个简单的函数,用于检查给定字符数组(s
)中的字符是否包含在另一个字符数组(t
)中,如果是,则匹配字符的索引为返回,否则返回-1。
您可以通过以下方式将其转换为指针算法:
int f (char* s, char* t) {
for (int i=0; *(s+i) !='\0\'; i++)
for (int j=0; *(t+j) !='\0'; j++)
if (*(s+i) == *(t+j)) return i;
return -1;
}
答案 2 :(得分:1)
该功能仅返回索引号和-1,如果找到正确的字符,则循环继续进行,然后循环被剪切并返回索引号,否则-1没有花括号,这意味着它将只读取第一行代码。它不执行所有操作,仅检查另一个字符串上至少有1个字符的存在。示例a和c将立即返回索引号,因为每个数组变量的索引0为“ e”,它不是所有值的比较,而只是1的比较。