我的 strcat 代码中的 printf 有什么问题?
What's wrong with printf in my strcat code?
我制作了这个程序来模拟 strcat 的功能,但是 printf 有一个我不明白的错误...
代码如下:
#include <stdio.h>
char *mystrcat(char *s1, char *s2);
int main(void)
{
char *s1,*s2;
s1="asdad";
s2="asdad";
s1=mystrcat(s1,s2);
printf(s1);
return 0;
}
char *mystrcat(char *s1,char *s2)
{
int i,j;
for(i=0;s1[i]<'[=10=]';i++) ;
for(j=0;s2[j]!='[=10=]';j++) s1[i+j]=s2[j];
s1[i+j]='[=10=]';
return s1;
}
至少,s1[i] < '[=10=]'
和s1[i] < 0
是一样的,总是假的。
第一个问题是 s1
没有足够的 space 来追加 s2
。您需要 s1
指向的缓冲区的大小至少为 strlen(s1) + strlen(s2) + 1
(+ 1
是 NUL 终止符)。
第二个问题是字符串文字是只读的。您从 "asdad"
分配 s1
,这会创建一个指向(可能)只读内存的指针。当然,第一个问题意味着你没有足够的 space 追加到末尾,即使它是可写的,但这是 C 中常见的陷阱之一,值得一提。
第三个问题(在中已经提到)是比较s1[i] < '[=17=]'
是错误的,你不会正确找到s1
的长度,因为循环不会运行 甚至单次迭代。正确的条件与第二个循环 != '[=19=]'
中的相同。 (这掩盖了问题 1,从那以后你无意中从头开始覆盖了 s1
。)
我制作了这个程序来模拟 strcat 的功能,但是 printf 有一个我不明白的错误...
代码如下:
#include <stdio.h>
char *mystrcat(char *s1, char *s2);
int main(void)
{
char *s1,*s2;
s1="asdad";
s2="asdad";
s1=mystrcat(s1,s2);
printf(s1);
return 0;
}
char *mystrcat(char *s1,char *s2)
{
int i,j;
for(i=0;s1[i]<'[=10=]';i++) ;
for(j=0;s2[j]!='[=10=]';j++) s1[i+j]=s2[j];
s1[i+j]='[=10=]';
return s1;
}
至少,s1[i] < '[=10=]'
和s1[i] < 0
是一样的,总是假的。
第一个问题是 s1
没有足够的 space 来追加 s2
。您需要 s1
指向的缓冲区的大小至少为 strlen(s1) + strlen(s2) + 1
(+ 1
是 NUL 终止符)。
第二个问题是字符串文字是只读的。您从 "asdad"
分配 s1
,这会创建一个指向(可能)只读内存的指针。当然,第一个问题意味着你没有足够的 space 追加到末尾,即使它是可写的,但这是 C 中常见的陷阱之一,值得一提。
第三个问题(在s1[i] < '[=17=]'
是错误的,你不会正确找到s1
的长度,因为循环不会运行 甚至单次迭代。正确的条件与第二个循环 != '[=19=]'
中的相同。 (这掩盖了问题 1,从那以后你无意中从头开始覆盖了 s1
。)