我的函数是这么定义的:
void aaa(char * str1)
{
...
sprintf(str1,"%s",str2);
...
}
调用函数:
char str[10];
memset(str,0,10);
aaa(str);问题:
1 如果str2长度超过10 ,会发生什么情况?(编译没有错误)
2 在函数aaa内,str1应该怎么赋值比较规范?

解决方案 »

  1.   

    1)那是c程序员最大的忌讳,缓冲区溢出,基本上这种攻击方法是黑客们攻击服务器的必修课。
    2)可以把长度作为参数,声明成memset那样。
      

  2.   

    我的函数aaa的str1是固定长度的输出,比如是10,该怎么处理呢?
      

  3.   

    1)那是c程序员最大的忌讳,缓冲区溢出,基本上这种攻击方法是黑客们攻击服务器的必修课。
    2)可以把长度作为参数,声明成memset那样。
      

  4.   

    标准写法:char *strncpy(char *strDest, char *strSource, int size)
    {   if (str1 == NULL || str2 == NULL)       return NULL;   char *strDestTemp = strDest;   while(size-- > 0  && (strDest++ = strSource++) != '\0');   return strDestTemp;  
         
    }
      

  5.   

    标准写法:char *strncpy(char *strDest, const char *strSource, int size)
    {   if (str1 == NULL || str2 == NULL)       return NULL;   char *strDestTemp = strDest;   while(size-- > 0  && (strDest++ = strSource++) != '\0');   return strDestTemp;  
         
    }
      

  6.   

    标准写法:char *MyStrCpy(char *strDest, const char *strSource)
    {   if (str1 == NULL || str2 == NULL)       return NULL;   char *strDestTemp = strDest;   int i = strlen(strDest);   while(i-- > 0  && (strDest++ = strSource++) != '\0');   return strDestTemp;
         
    }
      

  7.   

    楼上的,我的输出肯定是固定的,只是如何防止缓冲区溢出,即使加个count参数也是有可能的,c/c++是不是不能防止这种错误?
      

  8.   

    void aaa(char * str1)
    {
        ...
        int iTotal = strlen(str1)>strlen(str2) ? strlen(str2) : strlen(str1);
        memecpy(str1, str2, iTotal);
        ...
    }
      

  9.   

    void aaa(char * str1)
    {
        ...
        int iTotal = strlen(str1)>strlen(str2) ? strlen(str2) : strlen(str1);
        memcpy(str1, str2, iTotal);
        ...
    }