PDA

View Full Version : سوال: مشکل در استفاده از gets()



Mahdi13.ir
جمعه 02 مرداد 1394, 14:34 عصر
با سلام
وقتی پشت سر هم 2 بار یا بیشتر از تابع gets() استفاده میکنم برنامه وقتی به اولی میرسه اولی رو زیر پا میزاره و میره سراغ بعدی ها.
من هم میخوام برنامه C باشه و نمیخوام C++‎‎‎ استفاده کنم.
ممنون

mohammad0773
جمعه 02 مرداد 1394, 15:32 عصر
سلام.به احتمال زیاد این برای این هست که شما قبل از این تابع از scanf استفاده میکنید.یه راه در c++بلد بودم که از ignore استفاده میکردی ولی نمیدونم تو c همچین چیزی داریم یا نه

Mahdi13.ir
جمعه 02 مرداد 1394, 18:52 عصر
سلام.به احتمال زیاد این برای این هست که شما قبل از این تابع از scanf استفاده میکنید.یه راه در C++‎بلد بودم که از ignore استفاده میکردی ولی نمیدونم تو c همچین چیزی داریم یا نه
یه چیزی شبیه این هست:(در C++ چطوریه؟ممنون)

printf("NAME");
gets(data[digit].name);
printf("FAMILY");
gets(data[digit}.family);

rahnema1
جمعه 02 مرداد 1394, 19:11 عصر
سلام
احتمالا قبلا هنگام تعریف struct برای رشته ها سایز در نظر نگرفتید

mohammad0773
جمعه 02 مرداد 1394, 23:41 عصر
یه چیزی شبیه این هست:(در C++‎ چطوریه؟ممنون)

printf("NAME");
gets(data[digit].name);
printf("FAMILY");
gets(data[digit}.family);




#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int main(){
char word1[20],word2[20];
cout<<"enter word 1:\t";
cin>>word1;
cout<<"enter word 2:\t";
cin.ignore();
cin.getline(word2,19);
cout<<"word 1 is:"<<word1<<".\nword 2 is:"<<word2<<endl;
system("pause");
return 0;
}

خوب من برای شما یه برنامه ++C مثال میزنم و توضیحش میدم.
ببینید وقتی ما از cin استفاده میکنیم (در خط 9)در آخر بعد از وارد کردن متن،اینترو که میزنی،خود به خود ی ه کراکتر n\ در buffer یا همون حافظه موقت ورودی cin باقی میمونه.حالا ما فرض میکنیم که خط 11 رو ننوشتیم که اگه اینطوری باشه n\ بجای ورودی کاربر برای cin.getline ارسال میشود درحالی که ورودی را کاربر باید وارد کند.خوب ما از خط 11 استفاده میکنیم تا از حافظه موقت چشم پوشی شود.

Mahdi13.ir
شنبه 03 مرداد 1394, 15:40 عصر
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int main(){
char word1[20],word2[20];
cout<<"enter word 1:\t";
cin>>word1;
cout<<"enter word 2:\t";
cin.ignore();
cin.getline(word2,19);
cout<<"word 1 is:"<<word1<<".\nword 2 is:"<<word2<<endl;
system("pause");
return 0;
}

خوب من برای شما یه برنامه ++C مثال میزنم و توضیحش میدم.
ببینید وقتی ما از cin استفاده میکنیم (در خط 9)در آخر بعد از وارد کردن متن،اینترو که میزنی،خود به خود ی ه کراکتر n\ در buffer یا همون حافظه موقت ورودی cin باقی میمونه.حالا ما فرض میکنیم که خط 11 رو ننوشتیم که اگه اینطوری باشه n\ بجای ورودی کاربر برای cin.getline ارسال میشود درحالی که ورودی را کاربر باید وارد کند.خوب ما از خط 11 استفاده میکنیم تا از حافظه موقت چشم پوشی شود.
خیلی ممنون

Mahdi13.ir
پنج شنبه 08 مرداد 1394, 16:14 عصر
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int main(){
char word1[20],word2[20];
cout<<"enter word 1:\t";
cin>>word1;
cout<<"enter word 2:\t";
cin.ignore();
cin.getline(word2,19);
cout<<"word 1 is:"<<word1<<".\nword 2 is:"<<word2<<endl;
system("pause");
return 0;
}

خوب من برای شما یه برنامه ++C مثال میزنم و توضیحش میدم.
ببینید وقتی ما از cin استفاده میکنیم (در خط 9)در آخر بعد از وارد کردن متن،اینترو که میزنی،خود به خود ی ه کراکتر n\ در buffer یا همون حافظه موقت ورودی cin باقی میمونه.حالا ما فرض میکنیم که خط 11 رو ننوشتیم که اگه اینطوری باشه n\ بجای ورودی کاربر برای cin.getline ارسال میشود درحالی که ورودی را کاربر باید وارد کند.خوب ما از خط 11 استفاده میکنیم تا از حافظه موقت چشم پوشی شود.
میشه خط 12 رو جوری مدیریت کرد که با دریافت کاراکتر وایسه؟

mohammad0773
پنج شنبه 08 مرداد 1394, 16:32 عصر
میشه خط 12 رو جوری مدیریت کرد که با دریافت کاراکتر وایسه؟

میشه خط 12 رو جوری مدیریت کرد که با دریافت کاراکتر وایسه؟
من باید از شما یه عذر خواهی کنم چون برنامه بالا ناقص هست.
ما برای گرفتن رشته متنی از <<cin استفاده نمیکنیم بلکه از cin.getline استفاده میکنیم چون <<cinکراکتر خالی یا همون اسپیس رو آخر رشته تشخیص میده و هم بخواطر بافر ...پس تغییر پایین در خط9 برنامه رو درست خواهد کرد.

cin.getline(word1,19);

mohammad0773
پنج شنبه 08 مرداد 1394, 16:45 عصر
من باید از شما یه عذر خواهی کنم چون برنامه بالا ناقص هست.
ما برای گرفتن رشته متنی از <<cin استفاده نمیکنیم بلکه از cin.getline استفاده میکنیم چون <<cinکراکتر خالی یا همون اسپیس رو آخر رشته تشخیص میده و هم بخواطر بافر ...پس تغییر پایین در خط9 برنامه رو درست خواهد کرد.

cin.getline(word1,19);




خب اگر کاری رو که گفتم انجام بدید دیگه به cin.ignore نیازی نخواهید داشت.ولی در صورتی نیاز پیدا میکنید که یه متغیر از نوع غیر char رو با <<cinدریافت کرده باشید و میخوهید یه به یه رشته از نوع char مقدار بدید.من برای شما مثال برنامه ای رو میزنم که اول سن و بعد اسمشو بگیره:

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(){
char name[20];
int age;
cout<<"how old are you ? ";
cin>>age;
cout<<"what is your name? ";
cin.ignore();
cin.getline(name,19);
cout<<"your age is :"<<age<<".\nyour name is:"<<name<<endl;
system("pause");
return 0;
}



در اینجا ()cin.ignore نقش مهمی داره چون اگر نبود اسم در یافت نمیشد.

Mahdi13.ir
پنج شنبه 08 مرداد 1394, 17:44 عصر
ممنون
ولی من به جوابم نرسیدم.
منظورم اینه که وقتی انتر زده شد cin کار ذخیره سازی رو تموم کنه.
راه حلش در C++ چیه؟

mohammad0773
پنج شنبه 08 مرداد 1394, 21:41 عصر
ممنون
ولی من به جوابم نرسیدم.
منظورم اینه که وقتی انتر زده شد cin کار ذخیره سازی رو تموم کنه.
راه حلش در C++‎‎‎‎ چیه؟
ساده هست.باید قبل از cin.getline از cin.ignore استفاده کرد.

Mahdi13.ir
جمعه 09 مرداد 1394, 08:50 صبح
ساده هست.باید قبل از cin.getline از cin.ignore استفاده کرد.
پس اگه به این شکل استفاده کنم دیگه حافظه 19 کاراکتر ذخیره نمیشه؟

mohammad0773
جمعه 09 مرداد 1394, 14:58 عصر
پس اگه به این شکل استفاده کنم دیگه حافظه 19 کاراکتر ذخیره نمیشه؟
بله ذخیره خواهد شد،حافظه موقت cin رو با حافظه ای که متغیر اشغال میکند اشتباه نگیرید.

Mahdi13.ir
جمعه 09 مرداد 1394, 15:35 عصر
بله ذخیره خواهد شد،حافظه موقت cin رو با حافظه ای که متغیر اشغال میکند اشتباه نگیرید.

مشکلم حل شد.
خیلی ممنون

Mahdi13.ir
جمعه 09 مرداد 1394, 21:15 عصر
بله ذخیره خواهد شد،حافظه موقت cin رو با حافظه ای که متغیر اشغال میکند اشتباه نگیرید.

ولی دوباره یک مشکلی هست:

printf("\n\tEnter user information: ");
printf("\n\n\tNAME: ");
cin.ignore();
cin.getline(all[digit].name,20);
printf("\tFAMILY: ");
cin.ignore();
cin.getline(all[digit].family,20);
printf("\tFatherName: ");
cin.ignore();
cin.getline(all[digit].fathername,20);
printf("\tAGE: ");
scanf("%d",&all[digit].age);
printf("\tCITY: ");
cin.ignore();
cin.getline(all[digit].city,20);
digit+=1;


اولین کرکتر FAMILY و Fathername پس از ذخیره نمایش داده نمیشن!!!!!!!!!!!
از puts و cout استفاده کردم
مثلا Mohammad به شکل ohammad نمایش داده میشه

mohammad0773
شنبه 10 مرداد 1394, 06:10 صبح
ولی دوباره یک مشکلی هست:

printf("\n\tEnter user information: ");
printf("\n\n\tNAME: ");
cin.ignore();
cin.getline(all[digit].name,20);
printf("\tFAMILY: ");
cin.ignore();
cin.getline(all[digit].family,20);
printf("\tFatherName: ");
cin.ignore();
cin.getline(all[digit].fathername,20);
printf("\tAGE: ");
scanf("%d",&all[digit].age);
printf("\tCITY: ");
cin.ignore();
cin.getline(all[digit].city,20);
digit+=1;


اولین کرکتر FAMILY و Fathername پس از ذخیره نمایش داده نمیشن!!!!!!!!!!!
از puts و cout استفاده کردم
مثلا Mohammad به شکل ohammad نمایش داده میشه
در جواب های قبل توضیح داده بودم. ما موقعی نیاز به cin.ignore()خواهیم داشت که درستور برای ورودی قبل <<cin یاscanfباشد البته من نمیفهمیدم شما از scanfاستفاده میکنید وگرنه براتون میگفم.درنتیجه همه ی cin.ignore ها زیادی هستن بجز خط 14چون فبلش از scanfاستفاده کرده بودید.

Mahdi13.ir
شنبه 10 مرداد 1394, 07:15 صبح
در جواب های قبل توضیح داده بودم. ما موقعی نیاز به cin.ignore()خواهیم داشت که درستور برای ورودی قبل <<cin یاscanfباشد البته من نمیفهمیدم شما از scanfاستفاده میکنید وگرنه براتون میگفم.درنتیجه همه ی cin.ignore ها زیادی هستن بجز خط 14چون فبلش از scanfاستفاده کرده بودید.
ممنون
با اعمال یکم تغیرات در کد:


printf("\n\n\tNAME: ");
cin.ignore();
cin.getline(all[digit].name,20);
printf("\tFAMILY: ");
cin.getline(all[digit].family,20);
printf("\tFatherName: ");
cin.getline(all[digit].fathername,20);
printf("\tAGE: ");
cin >> all[digit].age;
printf("\tCITY: ");
cin.ignore();
cin.getline(all[digit].city,20);
digit+=1;


مشکل برطرف شد.بدون کمک شما امکان نداشت درست بشه.

mohammad0773
شنبه 10 مرداد 1394, 07:29 صبح
خواهش میکنم
ببخشید اگر طول داد