C 这个打印的是什么?如何将其转换为指针算术?

C 这个打印的是什么?如何将其转换为指针算术?,c,arrays,pointer-arithmetic,C,Arrays,Pointer Arithmetic,这是我的教授在一次考试中做的一个练习,我脑子里想不起来。我认为这与比较字符数组有关,但这似乎不仅仅是这样 #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) {

这是我的教授在一次考试中做的一个练习,我脑子里想不起来。我认为这与比较字符数组有关,但这似乎不仅仅是这样

#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;
}
#包括
int f(字符s[],字符t[]{
int i,j;
对于(i=0;s[i]!='\0';i++)
对于(j=0;t[j]!='\0';j++)
如果(s[i]==t[j])返回i;
返回-1;
}
内部主(空){
字符a[]=“地产”;
字符b[]=“vacanze”;
字符c[]=“以斯麦”;
字符d[]=“onda”;
字符e[]=“冲浪”;
printf(“调用结果:%d\n”,f(a,b));
printf(“调用结果:%d\n”,f(a,c));
printf(“调用结果:%d\n”,f(a,d));
printf(“调用结果:%d\n”,f(d,e));
返回0;
}

函数
f
正在对两个字符串进行逐字符比较。它不是一个strcmp,因为索引
i
j
不是同时前进的(也就是说,它不仅仅是比较
s[0]
t[0]
s[1]
t[1]
等。)

仔细观察嵌套循环。对于
i
的每个值,
j
循环遍历第二个字符串中的所有位置,该循环遍历第一个字符串中的位置

一旦找到任何匹配字符,函数将返回

因此,如果
s[0]
匹配
t
中的任何字符,将返回
0

如果
s[0]
t
中的任何字符不匹配,但
s[1]
t
中的某些字符匹配,则将返回
1

等等。返回的是
s
中与
t
中任何字符匹配的第一个字符的索引

如果这两个字符串没有公共字符,则返回结尾处的
-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;
}

这是一个简单的函数,用于检查给定字符数组(
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;
}

该函数只返回索引号和-1,循环继续进行,如果它找到了正确的字符,那么循环将被剪切并返回索引号,否则-1没有大括号意味着它将只读取第一行代码。它并不完全是cpmparing,它只检查另一个字符串上是否存在至少1个字符。示例a和c将立即返回索引号,因为每个数组变量的索引0都是“e”,它不是所有变量的比较,只是1。

运行此代码时得到了什么输出?@jwodder运行代码是什么意思?@Winter:编译和执行。