我自己制作了strcat()函数但是在添加字符串之后它会打印一个额外的ascii符号。 请说明原因?
#include<stdio.h>
#include<conio.h>
#include<string.h>
void xstrcat(char string1[],char string2[]);
void main(void)
{ char x[100];
char string1[40],string2[40];
printf("Enter a string:");
gets(string1);
puts("Enter another string:");
gets(string2);
xstrcat(string1,string2);
printf("%s",string1);
getch();
}
void xstrcat(char string1[],char string2[])
{
int i,x,y;
x=strlen(string1);
y=strlen(string2);
for(i=0;i<y;i++)
{ string1[i+x]=string2[i];
}//for ends
}
答案 0 :(得分:4)
您的xstrcat()
函数未在结果字符串的末尾放置空终止符。
一种可能的解决方法可能是在xstrcat()
函数返回之前放置以下内容:
string1[x+y] = '\0';
答案 1 :(得分:2)
在C中,字符串以NUL字节(值为0的字符)终止。 strlen
将告诉你从字符串的开头到NUL字节有多少个字符,不计算NUL字节本身。
所以当你执行这个循环时:
for(i=0;i<y;i++)
{ string1[i+x]=string2[i];
}
您永远不会将终止NUL字节从string2
复制到string1
,因此string1
不再具有终止NUL(您在循环中早先用第一个字符覆盖了NUL string2
)。当字符串缺少其终止NUL时,读取它的函数(例如printf
)将继续读取字符串的预期端点,直到它们最终在内存中的某处找到NUL字节。这可能会导致打印额外的字符和/或崩溃。
将y
更改为y+1
或在'\0'
中的x+y
处明确插入string1
。
答案 2 :(得分:1)
void xstrcat(char string1[],char string2[])
{
//int i,x,y;
size_t i, x, y;
// They could also be unsigned, but size_t is an unsigned big enough to hold the
// biggest in memory index possible
x=strlen(string1);
y=strlen(string2);
//for(i=0;i<y;i++)
for (i=0; i<=y; i++) // This picks up the null at the end
{ string1[i+x]=string2[i];
}//for ends
}
或者你可以这样做:
void xstrcat(char * string1, const char * string2)
{
while(*string1) {
string1++;
}
strcpy(string1, string2);
}
这应该快一点,因为它不必遍历任何一个字符串而是一次。它也不需要那么多的额外变量。
答案 3 :(得分:0)
你的循环
for (i = 0; i < y; i++) {
string1[i+x]=string2[i];
}
你正在读取字符串2,直到它的长度为1,只读到NULL之前的最后一个字符,如果你不知道c或c ++字符串是用NULL(0)字符终止的。
所以你的string1最后不会有一个NULL字符。
所以现在当你尝试打印你的string1时,它肯定会打印一些字符,因为你的字符串大小为40,这些字符都是垃圾。
大多数情况下,您将打印一个40个字符的字符串,除非这些垃圾值的开启时为0。
所以你应该把第二个字符串读到0,所以制作你的循环
for (i = 0; i <= y; i++)
或者你可以在将string2添加到字符串1之后在字符串1的末尾添加一个NULL字符。
string1[x+y] = 0;