vc++:字符串处理总结

1.strcpy()与sprintf()

strcpy()是简单的拷贝
sprintf()是带格式的拷贝

char arr[256];

memset(arr,0,sizeof(arr));

strcpy(arr,"hello world!");

sprintf(arr,"the value of arr is %s","hello world!");

2.printf(),sprintf(),fprintf()

都是把格式好的字符串输出,只是输出的目标不一样:
1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。
2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。
3 fprintf, 是把格式字符串输出到指定文件中,所以参数笔printf多一个文件指针FILE*。

引用自:http://zhidao.baidu.com/question/577226016.html

3.sprintf(),memcpy()

如果是读取二进制文件中的数据,然后再存储到另一个新的文件中,如果是使用sprintf(),可能会将文件中的0当做\0而不再进行写入操作,此时使用memcpy()可以解决这种问题,因为它提供了一个count个数来控制复制的字符个数而不至于提前终止拷贝操作。

   fp=fopen("a.txt","rb");
   if(fp==NULL)
   {
    return 0;
   }
   buf=new char[BUFFERSIZE+1];
   memset(buf,0,BUFFERSIZE+1);
   int readcount=0;
   while(!feof(fp))
   {
    readcount=fread(buf,1,BUFFERSIZE,fp);
    if(readcount>0)
    {
     *(buf+readcount)='\0';
     //法1:
     //sprintf(m_sendbuff,"%s%s",encode(buf,ENCODE,readcount),"\r\n");
     //sprintf(m_sendbuff,"%s%s",buf,"\r\n");//error,如果二进制数据中有0,有可能提前终止。。。
     //发2:
     memcpy(m_sendbuff,buf,readcount);//ok
  
     if(senddata()==0)
     {
      //MessageBox(NULL,_T("附件发送0 ERROR!"),_T("sendmail() Error!"),MB_OK);
      return 0;
     }
     memset(buf,0,BUFFERSIZE+1);
    }
   }
   sprintf(m_sendbuff,"%s","\r\n");
   if(senddata()==0)
   {
    //MessageBox(NULL,_T("附件发送1 ERROR!"),_T("sendmail() Error!"),MB_OK);
    return 0;
   }
   delete[] buf;
   fclose(fp);
  }
 }

4.StringCchPrintf()

StringCchPrintf()是sprintf的一个替代品。它接受一个格式字符串和参数列表和返回一个格式化字符串。提供检查功能,确保不越界访问。

5.strcpy(),strcpy_s()

strcpy_s 函式是 strcpy 的安全版本,属于 ISO/IEC TR 24731 的标准,某些 C 函式库支援这个函式,包含 Microsoft C Runtime Library(微软 C 语言执行时期函式库)。它与 strcpy 的不同在于,在它取得额外参数来决定目的缓冲区大小时,会因为发生溢位而出现错误,如此一来,就可以预防缓冲区溢位。由于 strcpy_s 对于 C 语言来说是新的函式,所以没有特别受到广泛支援。

例如, 我们有个数组: unsigned char buf[2];
当我们使用strcpy(buf, "1234567")时, 以buf为起点的*(buf+3)也就是buf[3]被写入值, 但是, 此时也许这个buf+3这个位置被其它的程序或变量使用时, 则会改变其它变量的值.
而strcpy_s(buf,2,"1234567")则告诉程序它只有两个字节, 此时, 程序不会将数据写入到 buf+3的地址中, 所以它更安全.

         memset(m_user,0,sizeof(m_user));

         strcpy_s(m_user,"aaa");//vc++中无警告

         strcpy(m_ user,"ccc");

 

 参考:http://zhidao.baidu.com/question/420256391.html

注:strcpy_s()有两个重载版本:

 strcpy_s(char(&_Dest)[_Size],const char* _source);
 strcpy_s(char* _dst,rsize_t sizeInBytes,const char* _src);

当然还有类似:strcat_s(),printf_s()

参考:http://zhidao.baidu.com/question/490624040.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值