我正在尝试解决我的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”。 数组小于字符串的长度,建议的代码如何在没有任何溢出的情况下工作? 谢谢你的回复。
答案 0 :(得分:3)
您的代码在副作用方面过于激进:+= 1
操作(通常简称为++
)应在复制到输出后应用,而不是在比较之后
此外,您需要在递增指针之前保存out
缓冲区的值,以便您可以返回指向复制字符串开头的指针。
char *orig = out;
for ( ; *s == *t ; s++, t++)
*out++ = *s;
*out = '\0';
return orig;
答案 1 :(得分:2)
您的代码返回指向out数组末尾的指针。不是开始。您需要隐藏out
的初始值并返回该值。
顺便说一下,你可以在比较中做作业并不意味着这是一个好主意。该代码将很难维护。
答案 2 :(得分:2)
&out[0]
相当于out
。因为C中的数组是通过引用传递的,所以在某种意义上,它确实返回整个数组。
您的解决方案仅打印"8"
,因为您将指针返回到数组的中间。当它试图打印字符串时,它无法知道它在数组/字符串的中间,因此您只能打印一个子字符串。