的strcat();打印额外的字符

时间:2010-07-02 18:52:31

标签: c

我自己制作了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
}

4 个答案:

答案 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;