使用指针数学而不是数组索引

时间:2014-01-08 10:00:03

标签: c arrays pointers

我正在尝试解决我的C编程书中发现的问题。

#include <stdio.h>
char *f (char s[], char t[], char out[]);
int main(void)
{
    char s[] = "ISBN-978-8884981431";
    char t[] = "ISBN-978-8863720181";
    char out[10];
    printf ("%s\n", f(s,t,out));
    return 0;
}
char *f (char s[], char t[], char out[]) {
    int i;
    for (i=0; s[i] == t[i]; i++)
    out[i] = s[i];
out[i] = '\0';
return &out[0];
}

从代码中可以看出,此代码用作返回值&amp; out [0]:这是否意味着整个数组用作返回值?

char *f (char s[], char t[], char out[]);
int main(void)
{
    char s[] = "ISBN-978-8884981431";
    char t[] = "ISBN-978-8863720181";
    char out[10];
    printf ("%s\n", f(s,t,out));
    return 0;
}
char *f (char s[], char t[], char out[]) {
    for (; *(s+=1) == *(t+=1);)
            *(out+=1) = *s;
    *(out+1) = '\0';
    return out;
}

这是我提出的解决方案,但是当建议的代码返回“ISBN-978-88”时,我的只返回“8”。 数组小于字符串的长度,建议的代码如何在没有任何溢出的情况下工作? 谢谢你的回复。

3 个答案:

答案 0 :(得分:3)

您的代码在副作用方面过于激进:+= 1操作(通常简称为++)应在复制到输出后应用,而不是在比较之后

此外,您需要在递增指针之前保存out缓冲区的值,以便您可以返回指向复制字符串开头的指针。

char *orig = out;
for ( ; *s == *t ; s++, t++)
    *out++ = *s;
*out = '\0';
return orig;

Demo on ideone.

答案 1 :(得分:2)

您的代码返回指向out数组末尾的指针。不是开始。您需要隐藏out的初始值并返回该值。

顺便说一下,你可以在比较中做作业并不意味着这是一个好主意。该代码将很难维护。

答案 2 :(得分:2)

&out[0]相当于out。因为C中的数组是通过引用传递的,所以在某种意义上,它确实返回整个数组。

您的解决方案仅打印"8",因为您将指针返回到数组的中间。当它试图打印字符串时,它无法知道它在数组/字符串的中间,因此您只能打印一个子字符串。