我是一个初学者,我试图构建一个函数,获取2个字符串的2个指针,并将第二个字符串复制到第一个字符串的末尾(我们可以假设第一个字符串中有足够的位置来包含它们)。 但是这个功能实际上只是放了这个'堆栈'堆栈'在第一个字符串的末尾,并且在它们之间有很多“空”'。我真的不明白为什么。 任何人都可以帮我理解这个问题吗?谢谢
#include <string.h>
#include <stdio.h>
void Strcat(char* t, char* s);
void main()
{
char str1[14] = "zehavit", str2[] = "stack";
Strcar(str1, str2);
printf("%s", str1);
}
void Strcat(char * t, char * s)
{
int i = 0, counter = 0;
while ((*t) != '\0')
{
counter++;
t++;
}
while ((*s) != '\0')
{
t[counter-1+i] = (*s);
s++;
i++;
}
}
答案 0 :(得分:5)
在我看来,你做了很多多余的事情。
例如,t
已经提升,为什么还要添加counter
呢?
也许你可以试试这样的东西?
void Strcat(char * t, char * s)
{
while (*t)
{
t++;
}
while (*s)
{
*t = *s;
s++;
t++;
}
*t=0;
}
答案 1 :(得分:4)
第一次循环后
t
counter
和t[counter-1+i] = (*s);
都移动了一段字符串,所以
while(*s)
*t++ = *s++;
*t = '\0'; /* do not forget to NULL terminate that thing */
开始不是从字符串的结尾复制,而是从减1复制两次。 你很有可能想到:
JPG images
答案 2 :(得分:2)
函数中存在两个严重错误
第一个是使用索引
的表达式t[counter-1+i] = (*s);
^^^^^^^^^^^
让我们假设第一个字符串为空。在这种情况下,counter
将等于0.
所以在函数的第二个循环中i
也等于0时,尝试访问数组之外的内存。
while ((*s) != '\0')
{
t[counter-1+i] = (*s); // if counter and i is equal to 0 then there is t[-1]
s++;
i++;
}
第二个错误是结果字符串未附加终止零。
当函数返回指向结果字符串的指针时,最好也是这样。
因此该功能看起来像
char * Strcat(char *t, const char *s)
{
char *p = t;
while ( *p ) ++p;
do { *p++ = *s; } while ( *s++ );
return t;
}
这是一个示范程序
#include <stdio.h>
char * Strcat(char *t, const char *s)
{
char *p = t;
while ( *p ) ++p;
do { *p++ = *s; } while ( *s++ );
return t;
}
int main( void )
{
char t[12] = "Hello ";
char *s = "World";
puts( Strcat( t, s ) );
}
考虑到根据C标准函数main
,没有参数应声明为
int main( void )
答案 3 :(得分:0)
建议更改此循环:
while ((*s) != '\0')
{
t[counter-1+i] = (*s);
s++;
i++;
}
为:
// append all of second string, except NUL terminator byte
for( i=0; s[i]; i++ )
t[counter+i] = s[i];
// append NUL terminator byte
t[counter+i] = '\0';