此打印内容是什么,如何将其转换为指针运算?

时间:2018-07-22 22:26:40

标签: 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) {
 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;
}

3 个答案:

答案 0 :(得分:2)

函数f对2个字符串进行逐字符比较。它不是strcmp,因为索引ij不会同时前进(即,它不只是将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的比较。