Kỹ thuật C++ cách sử dụng hàm strcpy() và thư viện string với visual studio ultimate 2010 [Archive] – Cộng đồng C Việt

View Full Version : Kỹ thuật C++ cách sử dụng hàm strcpy() và thư viện string với visual studio ultimate 2010

code_c

Mình cảm thấy rất bực khi sài cái visual 2010 này, nhất là mỗi khi cần dùng đến ham và lệnh với thư viện string, lỗi điển hình như sau:

warning C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
hàm strcpy() trong thư viện string đúng rồi còn báo lỗi gì ko biết, ai biết chỉ giúp tớ với (:-)$

VoTichSu

Qua đến phiên bản 2010 của các phần mềm. Microsoft đã bị bắt buộc phải theo đà tiến triển của giới công nghệ, tức là phải cung cấp những hổ trợ có tính cách an toàn.

Câu trên chỉ là câu cảnh báo chữ không phải là lỗi.
Nó chỉ nói là hàm strcpy căn bản không an toàn (có khả năng bị lỗi tràn chỗ chứa), và nó đề nghị bạn dùng một hàm khác (strcpy_s).

Nếu bạn không thích bị cảnh báo, thì hãy theo dõi câu cảnh báo trên cũng có chỉ dẫn cho bạn cách thức bỏ qua nó. Một khi bạn theo cách thức này rồi thì nó sẽ không bao giờ cảnh báo nữa.

Người xài đồ xịn mà không tham khảo qua cách thức sử dụng trước thì luôn gặp cái bực mình.

nguyen tan cuong

her her bạn chỉ cho mình luôn cách đi, mình thật sự ko biết (8-)>

bạn có đọc cái warning chưa:
warning C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

nó nói: hàm strcpy không an toàn, dùng strcpy_s thay thế. Để vô hiệu hoá cảnh báo dùng macro _CRT_SECURE_NO_WARNINGS. Xem online help để biết thêm chi tiết.

đại loại đầu file mã nguồn khai báo như thế này

#define _CRT_SECURE_NO_WARNINGS

treatmaster

thêm cách này nữa cho dễ.
#pragma warning(disable:4996)

boss14420

Mình không dùng VS nên không rõ lắm nhưng bạn thử hàm strncpy xem còn warning nữa không ? Hàm này cũng có kiểm tra kích thước và tương thích với chuẩn.

nguyen tan cuong

thêm cách này nữa cho dễ.
#pragma warning(disable:4996)

sẵn tiện đây hỏi luôn bác câu lệnh #pragma sử dụng như thế nào vậy. Lênh google ít trang nào nói về nó.

pkthanh92

#pragma token-string

hoặc

__pragma(token-string)

trong đó token-string có thể là warning như ví dụ trên, có thể là một trong danh sách dưới đây:

alloc_text
auto_inline
bss_seg
check_stack
code_seg
comment

pragma được dùng để thiết lập một số tính năng của trình biên dịch.

như ví dụ trên trình dịch thông báo warning, bạn muốn tắt warning đó đi thì viết #pragma warning(disable:4996), mỗi một token-string có các tham số và tác dụng riêng, bạn tham khảo đầy đủ ở đây: http://msdn.microsoft.com/en-us/library/d9x1s805.aspx

lưu ý cái này là microsoft specific, nên chỉ dùng cho VC++ thôi.

code_c

bác nào xem hộ em cái nó lại dở chứng báo cái lỗi đó rồi (D:)> bây giờ xem cái gì vào để chữa hả mấy bác 😀

clchicken

Đó ko phải là lỗi. Có thấy chữ WARNING nó có 7 ký tự còn chữ ERROR nó chỉ có 5 ký tự ko ?
Người khác đã nói rõ cho bạn biết rồi mà ?

VTS nói quá rõ ràng rồi bạn ko chịu đọc gì cả. Muốn “sống chung với lũ” hay “đi núp chỗ cao khác” thì cứ làm theo hướng dẫn

Nếu sống chung thì hãy cứ để vậy mà “xem cho vui mắt” chứ ko nên tắt thông báo warning đi.
Có nhiều cái warning “nguy hiểm khủng khiếp” cần phải quan sát nữa. Phải để warning lại mà quan sát, đánh giá, khắc phục

Tập cách “đọc những gì compiler nói” đi bạn

code_c

Đó ko phải là lỗi. Có thấy chữ WARNING nó có 7 ký tự còn chữ ERROR nó chỉ có 5 ký tự ko ?
Người khác đã nói rõ cho bạn biết rồi mà ?
VTS nói quá rõ ràng rồi bạn ko chịu đọc gì cả. Muốn “sống chung với lũ” hay “đi núp chỗ cao khác” thì cứ làm theo hướng dẫn
Nếu sống chung thì hãy cứ để vậy mà “xem cho vui mắt” chứ ko nên tắt thông báo warning đi.
Có nhiều cái warning “nguy hiểm khủng khiếp” cần phải quan sát nữa. Phải để warning lại mà quan sát, đánh giá, khắc phục
Tập cách “đọc những gì compiler nói” đi bạn
Thực ra đang thi cử nên mỉnh cũng ko để tâm mấy, bây giờ mình hiểu qua rồi và đã thêm 1 trong hai lệnh sau

#pragma warning(disable:C4996)
#define _CRT_SECURE_NO_WARNINGS

đã chạy rồi nhưng nó lại báo lỗi sau
http://i1095.photobucket.com/albums/i472/OLAKEN91/Untitled1-2.jpg

đây là code mới.

#include “iostream”
#include “conio.h”
#include “stdio.h”
#include “string.h”
#include “iomanip”

#pragma warning(disable:C4996)
//#define _CRT_SECURE_NO_WARNINGS

using namespace std;

class cstring
{
private:
char*str;
int length;
public:
cstring();
cstring(const cstring &);
~cstring();
cstring(char *);
cstring operator+(cstring &);
cstring & operator=(const cstring &);
friend istream & operator>>(istream &is,cstring &);
friend ostream & operator<<(ostream &os,cstring &s);
};
cstring::cstring()
{
length=0;
str=NULL;
}
cstring::cstring(const cstring &s)
{
length=s.length;
str=new char[length+1];
strcpy(str,s.str);
}
cstring::~cstring()
{
delete []str;
}
cstring::cstring(char *s)//chuyen doi kieu
{
//cout<<“constructor chuyen doi kieu\n”;
length=strlen(s);
str=new char[length + 1];
strcpy(str,s);
}
cstring & cstring::operator=(const cstring &s)//toan tu gan
{
if(&s!=this)
{
delete []str;
length=s.length;
str=new char[length+1];
strcpy(str,s.str);
}
return *this;
}

cstring cstring::operator+(cstring &s)//toan tu +
{
cstring st;
st.length=length + s.length;
st.str=new char[st.length+1];
strcpy(st.str,str);//st.str=str
strcat(st.str,” “);
strcat(st.str,s.str); //st.str = st.str + s.str
return st;
}
istream &operator>>(istream &is,cstring &s)
{
char tmp[100];
is.getline(tmp,100);
s=tmp;
return is;
}
ostream &operator<<(ostream &os,cstring &s)
{
os<<s.str;
return os;
}
int main()
{
cstring s1(“hello”),s2(“viet Nam”),s3;
cout<<“Chuoi s1:”<<s1<<“\n”;
cout<<“Chuoi s2:”<<s2<<“\n”;
s3=s1+s2;
cout<<“Chuoi s1 + chuoi s2 : “<<s3<<“\n”;
cstring s4,s5,s6;
cout<<“Nhap chuoi s4:”;
cin>>s4;
cout<<“Chuoi s4 = “<<s4<<“\n”;
cout<<“Nhap chuoi s5:”;
cin>>s5;
cout<<“\nChuoi s5 = “<<s5<<“\n”;
s6=s4+s5;
cout<<“\nChuoi s4 + chuoi s5 = “<<s6;
getch();
}

clchicken

Hix. Bạn trỏ lỗi đi đâu thế.
Phải trỏ vào cái code của bạn chứ. Trỏ qua file khác thế kia biết đường nào mà lần đây 🙁

pkthanh92

sửa lại toán tử +

cstring cstring::operator+(cstring &s)//toan tu +
{
cstring st;
st.length=length + s.length +1;
st.str=new char[st.length+1];
strcpy(st.str,str);//st.str=str
strcat(st.str,” “);
strcat(st.str,s.str); //st.str = st.str + s.str
return st;
}

lần sau cấp phát cần chú ý hơn.

quandaso

Sao bạn ko bỏ strcpy để xài strcpy_s để chắc chắn chương trình hoạt động ổn định nhỉ :D, nó warning là có lí do đấy (:-)?

//Build với Visual C++ 10.0
#include <iostream>
using namespace std;
int main()
{
const char *Src = “087cc62881036ef4aa2706a9f6d0edbd”;
size_t size = strlen(Src) + 1;
char *Des = new char[size];
strcpy_s(Des, size, Src);
cout << Des << endl;
//delete[] Des ;
return 0;
}

code_c

cám ơn ý kiến đóng góp của các bạn, nó chạy được rồi (Y:DY)

Sao bạn ko bỏ strcpy để xài strcpy_s để chắc chắn chương trình hoạt động ổn định nhỉ , nó warning là có lí do đấy hồi giờ mình wen sài strcpy() rồi, giờ mà chuyển sang strspy_s() không hiểu cú pháp, bạn có thể giải thích cho mình cú pháp hàm strcpy_s() của bạn được ko ?
strcpy_s(Des, size, Src);Des là gì ? để làm gì ? tương tự với size và Src ? 0:)

VoTichSu

des là viết tắt của destination (nơi đến) tức là cái string cần chép vào. Size là cỡ, tức là giới hạn cho phép chép vào. Src là viết tắt của source (khởi diểm) tức là cái string cần chép.
Khi dùng strcpy, nếu src dài hơn des thì sẽ bị bể ổ. Dùng strcpy_s, ta có thể giới hạn độ dài được chép qua size.

wen là gì? tên của một người tầu hay đại hàn?

quandaso

cám ơn ý kiến đóng góp của các bạn, nó chạy được rồi (Y:DY)
hồi giờ mình wen sài strcpy() rồi, giờ mà chuyển sang strspy_s() không hiểu cú pháp, bạn có thể giải thích cho mình cú pháp hàm strcpy_s() của bạn được ko ?Des là gì ? để làm gì ? tương tự với size và Src ? 0:)
Hàm strcpy_s chỉ khác strcpy ở chỗ là cần phải ghi rõ kích thước cần copy (điều này giúp hạn chế lỗi rất nhiều). Ở đây Src là xâu gốc, Des là xâu đích, mình dùng con trỏ để tiện cho việc cấp phát động, tức là dù xâu gốc có dài bao nhiêu thì ta ko cần phải quan tâm, thay vì dùng mảng phải biết trước kích thước của xâu.

size_t size = strlen(Src) + 1; là vì xâu trong C có 1 kí tự ẩn ở cuối là ‘\0’ nên cần cấp phát bộ nhớ bằng độ xài xâu cộng thêm 1 byte nữa. Code trên bạn có thể dùng mảng, tuy nhiên lại ko tiện cho việc sử dụng sctrcpy_s

#include <iostream>
using namespace std;
int main()
{
const char *Src = “087cc62881036ef4aa2706a9f6d0edbd”; //Xâu có 32 kí tự
// size_t size = strlen(Src) + 1;
char Des[33]; // = new char[33];
strcpy_s(Des, 33, Src);
cout << Des << endl;
//delete[] Des ;
return 0;
}

code_c

wen là gì? tên của một người tầu hay đại hàn? wen là quen đó bác, lại chọc ngoé anh em rồi, nhưng dù sao cũng cám ơn bạn đã giải thích, h thì hiểu cú pháp strcpy_s roài 😀

sf6645502

bác nào xem hộ em cái nó lại dở chứng báo cái lỗi đó rồi (D:)> bây giờ xem cái gì vào để chữa hả mấy bác 😀

Code_C ơi : bạn thêm _s là hết đấy —->strcpy_s .

prog10

C đã có strncpy, còn strcpy_s là VS only -> phi chuẩn.
http://www.cplusplus.com/reference/cstring/strncpy