ايران ويج

نسخه‌ی کامل: مشکل با cin
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام !

امروز مسابقه acm خیلی ها روی یکی از سوال ها یه مشکل عجیب داشتن !!

سوال خیلی ساده بود! ورودی اول یه عدد میده که تعداد تست کیس ها رو مشخص می کنه. بعد برای هر تست کیس دو خط رشته میده که رشته اول یه متن کد شده و رشته دوم کلید ! کلید 26 حرفه که به ترتیب حروف الفبا مشخص می کنه حروف تغییر داده شده چی هستن . . .

مشکل روی دریافت ورودی بود.
کد php:
#include <iostream>
#include <string>
using namespace std;

void main()
{
    
int n;
    
string s1,s2;
    
    
cin >> n;
    
//cin.ignore();

    
getline (cins1'\n');
    
getline (cins2'\n');

    
cout << s1 << endl;

    
cout << s2 << endl;


کد php:
#include <iostream>

using namespace std;

void main()
{
    
int n;
    
char s1[100],s2[100];
    
    
cin >> n;
    
//cin.ignore();

    
cin.getline (s1100'\n');
    
cin.getline (s2100'\n');

    
cout << s1 << endl;

    
cout << s2 << endl;


مثل اینکه اگه یه بار از cin استفاده کنیم، این cin روی getline بعدی اثر میذاره. \n از cin جا میمونه و میره برای getline بعدی . . . هر کی یه راه حلی می گفت. یکی می گفت از cin.ignore() استفاده کنید. یکی می گفت دوبار باید از getline استفاده کرد تا \n رد بشه . . . بعضی از روش ها جواب میداد ولی وقتی برنامه رو میفرستادیم قبول نمی کرد. اونطرف سیستم عامل لینوکس بود و کامپایلر gcc . داور می گفت آخر رشته ها بعضی وقت ها \r هست و بعضی وقت ها \n و بعضی وقت ها ترکیبی از این دوتا! به سیستم عامل مربوط میشه! می گفت نکته سوال اینه که ورودی رو یه جوری بگیرین که ربطی به آخر رشته نداشته باشه و به اون آخر حساسیت نشون نده !
ما برنامه رو 15 بار فرستادیم ! ولی آخرش نشد ! همه روش ها رو امتحان کردیم! بعضی وقتها با دوبار اینتر مشکل حل میشد . . . یکی از تیم هایی هم که حل کرده بود می گفت رو کامپیوتر خودشون جواب نمیداد ولی اونطرف برای داور جواب داده ! خلاصه این سال بالایی ها مشکل نداشتن !
شما می دونید باید چیکار کرد ؟
حقیقتش دقیق نفهمیدم قضیه چی بوده و اونور چه اتفاقی میفتاده که میگی "قبول نمیکرد" . یعنی مثلا اون n اولی رو میگرفته یا نمی گرفته ؟ اون دو خط بعد چی ؟ میگرفته یا نمی گرفته ؟
اگه میگرفته ، خوب چرا با یه حلقه و find و replace هر چی n\ و r\ بود حذف نمی کردید؟ ...
یه چیز دیگه رو هم نمیفهمم .. تو لینوکس (و کلا یونیکس) کاراکتر سرخط n\ هست و توی ویندوز n\r\ ... حالا اینا چجوری اطلاعات رو وارد می کردن که یه بار r\ هم میشده ؟! ... (سیستم عاملی نمیشناسم کاراکتر سرخطش r\ باشه ...)
منم دیگه الان کد ها و روش هایی رو که امتحان کردیم ندارم که بخوام بیشتر توضیح بدم . . . قاتی کردم ! فقط همین یادمه که می گفت باید یه کاری کنید که به آخر رشته کاری نداشته باشه !!