پی سی سیتی

پی سی سیتی (http://p30city.net/index.php)
-   زبان های برنامه نویسی Programming (http://p30city.net/forumdisplay.php?f=12)
-   -   پرسش و پاسخ زبان سی پلاس پلاس c++ (http://p30city.net/showthread.php?t=12017)

دانه کولانه 01-28-2012 12:48 AM

عدم استفاده از gets() در C++ سر ریزی بافر و مشکلات امنیتی
 
خدا چه میگی مهرگان سوالت مگه ای نیست که چجو از gets استفاده بکنی ؟

gets با cin.get خو فرق مکنه .

gets اصلا دیگه cin نمیخواد
تو الان سوالت چیه ؟

خو هر چی که میخوای با gets بگیر


کد:

#include <stdio.h> البته وقتی نیم اسپیس استاندارد رو یوز میکنی فکر کنم اینو نیاز نداره دیگه

int main()
{
  char string [256];
  printf ("Insert your full address: ");
  gets (string);
  printf ("Your address is: %s\n",string);
  return 0
{

منتهی مشکل تکنیکی ای که وجود داره اینه که برنامه نویسها میگن از gets استفاده نکنین چون میتونه بافر اور فلو رخ بده و از این راه هکر ها خیلی سواستفاده میکنند

Function is intrinsically unsafe and should not be used
نقل قول:



Replace gets() with a C++ stream method that has a limit on the number of characters that will be read into the buffer (cin.getline(buffer, bufSize), for example).

If "buf" is a static buffer locally defined, bufSize can be replaced by sizeof(buffer). If malloc'd, use the malloc size.
Examples of Incorrect Code
کد:

char str1[10];
gets(str1);

    /* If the string is more than 10 characters, the overflow will spill over into the adjoining memory. */


راه درستش
کد:

char str1[10];
fgets(str1, sizeof(str1), stdin);
    /* Will not overflow.
Note that if buffer is malloc'd, sizeof() will not work and the malloc size should be used. */
/* In C++, use of iostream::getline() is preferred. */


مهرگان 01-28-2012 01:02 AM

آقا ای کده نگا بکو شما

مثلا میگم چند نفر دانشآموز مخوای وارد بکنی؟
طرف میگه n نفر
امجا (!) میگم خو اسمشه وارد بکو
آقا اسمشه نمیگیره:102:

int n;
یا
char ch;
char str[100];

cin >> n;
gets(str);

الان str اصلا نمیگیره

دانه کولانه 01-28-2012 01:40 AM

استفاده از stringstream در c++ کار با رشته ها تفاوت با cin
 
متوجه شدم چی میگی مساله اینتر زدن هست . اینتر رو هم میریزه توی استرینگ ! .
بنابراین یه راهش اینه که اون یه دونه اینتر رو دور بریزی مثل مثالی که خودت زدی والبته راه چیپی نیست ها خود c++ اینو داره cin.ignore() بنابراین کاسه داغتر از اش نشو :d

یا اینکه :
کد:


#include <iostream>
#include <string>
#include <sstream>
#include <conio.h>

using namespace std;

int main ()
{
  string mystr;
  float price=0;
  int quantity=0;

  cout << "Enter price: ";
  getline (cin,mystr);
  stringstream(mystr) >> price;
  cout << "Enter quantity: ";
  getline (cin,mystr);
  stringstream(mystr) >> quantity;
  cout << "Total price: " << price*quantity << endl;
  getch();
  return 0;

}


برای اینکه متوجه بشی این استرینگ استریم چیکار میکنه اینو به کار ببر یه دقیقه :
کد:

  stringstream(mystr) >> price;
cout<<endl<<mystr<<" "<<price;

بعد وقتی ورودی میدی بهش اینو بده :

12d

خروجی که مشاهده میکنی اینه :

12d 12

یعنی 12d رو که رشته هست میریزه توی mystr بعد قسمت int از mystr رو میریزه توی price

اوکی ؟


اکنون ساعت 09:18 PM برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد.

Powered by vBulletin® Version 3.8.4 Copyright , Jelsoft Enterprices مدیریت توسط کورش نعلینی
استفاده از مطالب پی سی سیتی بدون ذکر منبع هم پیگرد قانونی ندارد!! (این دیگه به انصاف خودتونه !!)
(اگر مطلبی از شما در سایت ما بدون ذکر نامتان استفاده شده مارا خبر کنید تا آنرا اصلاح کنیم)