#include<iostream.h>
#include<string.h>
int Add(int x,int y)
{
return x+y;
}
char *Add(char *x,char *y)
{
return strcat(x,y);
}
void main()
{
int a=1,b=2;
char str1[10]="I am";
char str2[13]=" a student."; 
cout<<Add(a,b)<<endl;
cout<<Add(str1,str2)<<endl;
  
}
这样运行是正确的,但是调换最后两行的程序后却输出错误的结果,请帮忙解决。谢谢

解决方案 »

  1.   

    这是函数重载的问题
    如果你的是类的成员中的重载,那么是不会有问题的。
    现在你是在main()中进行的重载。就有重载二义性问题了。
    #include <iostream.h>
    #include <string.h>
    int Add(int x,int y)
    {
      return x+y;
    }
    char *Add(char *x,char *y)
    {
      return strcat(x,y);
    }
    void main()
    {
      int a=1,b=2;
      char str1[10]="I am";
      char str2[13]=" a student.";
      cout <<Add(a,b)<<endl;
      cout <<Add(str1,str2) <<endl;

    这样子有正确结果,编译器是先扫描你的int Add(int x,int y)然后再扫描 char *Add(char *x,char *y)读到一个重载用的表项里面。然后当你调用Add(a,b)的时候,去遍历那个重载用的表,发现int Add(int x,int y)适合,就调用了它。然后轮到Add(str1,str2)了,不过这个时候,在重载表项的第一个项int Add(int x,int y)不能满足它。然后继续遍历。发现char *Add(char *x,char *y)可以,然后就调用,就得到了正确的结果。
      

  2.   

    char str1[100]="I am"; 
    你的字符串长度问题,造成溢出了。
      

  3.   


    应该是这个原因 试验了
    LZ说后两行换次序后 char*版的会溢出 int版就是错误结果
    先int再char*则不会 或改str1[100]也不会
      

  4.   

    strcat,是把后面str2字符串拷贝到str1分配的内存区里,str1分配的内存太小了。如果是分配20个字节就没有问题。
      

  5.   

    jcxgz
    的回答应该是对的吧!
    谢谢你的帮助啊。
    我一新手,请多指教啊。
    谢谢!