الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة لدي في دالة getline ..~

بدأه الحاسوبجية ..~ في 16 مايو 2012 · 7 رد · 1,632 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم والرحمة ..~

مساؤكم خير

لو سمحتو أنا عندي مشكلة في برنامج

المشكلة هي أنني عرفت متغيرين string

ووضعتهم في دالة getline وضمنتها في مكتبة string

المتغير الأول لا يمرر أي لا ينفذه البرنامج ويتجاهله

والمتغير الثاني يمرر وينفذ أمر الإدخال فيهـ

وههـ صورة توضح مقصدي :

1337183239641.jpg

حاولت فيها كثيرا ,, ولم أعرف المشكلة !!

#2

AudaNix

أستاذي هذا الكود

جزآك الله خير


#include<string>
using namespace std ;
void f(int R , int N, string P1,string P2);
int main(){
int r,n;
string p1 ;
string p2 ;
while(1==1){
cin>>r ;
cin>> n ;
getline(cin,p1);
p1.erase(remove(p1.begin(), p1.end(), '\"'), p1.end() );
getline(cin,p2) ;
p2.erase(remove(p2.begin(), p2.end(), '\"'), p2.end() );
f(r,n,p1,p2);

}

system("PAUSE") ;
return 0 ;
}
#include<iostream>

تم تعديل هذه المشاركة بواسطة الحاسوبجية ..~ في 16 مايو 2012 في 23:33

#3

السلام عليكم

هل تريد شيئا كهذا ؟

#include<iostream>
using namespace std ;
int main(){
    string p1,p2;
    cout<<"p1 = ";
    getline(cin,p1);
    cout<<"p2 = ";
    getline(cin,p2);
    cout<<"p1 = "<<p1<<"\np2 = "<<p2;
    return 0 ;
}

ملاحظات :

  • لا يوجد تعريف للدالة f داخل الكود !
  • لا أظن أنه توجد دالة باسم remove في الفئة string
#4

أحمد الشنقيطي كتب:

السلام عليكم

هل تريد شيئا كهذا ؟


using namespace std ;
int main(){
string p1,p2;
cout<<"p1 = ";
getline(cin,p1);
cout<<"p2 = ";
getline(cin,p2);
cout<<"p1 = "<<p1<<"\np2 = "<<p2;
return 0 ;
}
#include<iostream>

ملاحظات :

  • لا يوجد تعريف للدالة f داخل الكود !
  • لا أظن أنه توجد دالة باسم remove في الفئة string

اممممم لا ليس هذا مقصدي أنا أريد المدخلات تكون داخل while

وتدخل القيم بحث أن p1 , p2 تكون معرفة string بدالة getline

والدلة f هي call functon

حتى أمررها في في الفانكشون التي تجرى فيها العمليات

تم تعديل هذه المشاركة بواسطة الحاسوبجية ..~ في 17 مايو 2012 في 13:19

#5

لو سمحتو أحتاج المساعدة منكم ..~

#6

جربي هذا الكُود :

#include<iostream>
#include<string>
#include<algorithm>
using namespace std ;

void f(int R , int N, string P1,string P2);

int main() {

    int r;
    int n;
    string p1;
    string p2;

    while( 1 == 1 ) {
        cout << "Enter r  : ";
        cin >> r;

        cout << "Enter n  : ";
        cin >> n;

        cin.ignore();

        cout << "Enter p1 : ";
        getline(cin, p1);
        p1.erase( remove(p1.begin(), p1.end(), '\"'), p1.end() );

        cout << "Enter p2 : ";
        getline(cin, p2);
        p2.erase( remove(p2.begin(), p2.end(), '\"'), p2.end() );

        f(r,n,p1,p2);
        cin.clear();
    }
    return 0 ;
}

void f(int R , int N, string P1,string P2) {
    cout << "r  = " << R << endl;
    cout << "n  = " << N << endl;
    cout << "p1 = " << P1 << endl;
    cout << "p2 = " << P2 << endl;
}

حسبما أتوقّع أن سبب الخلل في برنامجك هُنا (إذا أهملنا بعض الأجزاء):

        cin>>r ;
        cin>> n ;
        getline(cin,p1);
        getline(cin,p2) ;

تفسيري لما يحديث :

في السطر الاوّل ستدخلين قيمة, والدالة cin ستأخذ ماتدخلين قبل "n\" وستبقى "n\" في الـstdin وهو فعلياً نوع خاص من الأجهزة يُمكنك قرأته كملف. لو كنت تستخدمين أحد أنظمة Unix ستجدينه على المسار :

/dev/stdin

إنظري لبرنامج الـC هذا:

#include<stdio.h>

int main(void) {

    FILE* file;
    file    = fopen("/dev/stdin", "r");

    char buffer[6];

    fread(buffer, sizeof(char), 5, file );
    fclose(file);

    buffer[6]   = '\0';
    printf("%s\n", buffer);

    return(0);
}

عند تشغيله :

$ gcc test_stdin.c $ ./a.out 
aaaaaaaaaaaaaaaa
aaaaa
$

ﻻحظي أنني لم أستخدم اي دالة قرأة من المُستخدم ورغم هذا قرأت مُدخلات المستخدم عن طريق قرأءة هذا الجهاز (ﻻ أعلم بشأن ويندوز ولكن حتماً الأمور تستير بنفس الطريقة).

في السطر الثاني, الدالة cin ستنظف مابقي من الإدخال السابق وتنتظر حتّى تدخلين قيمة ثُم ستأخذ ماتدخلين قبل "n\" (وستبقى "n\" في الـstdin).

في السطر الثالث سيحدث الخلل حيث ستقرأ الدالة getline الـstdin وستنظر حتى تُصادف "n\" , ﻻتُنظف مابقي من المُدخلات السابقة, وستجد أن هناك "n\" واحد , من الإدخال السابق, وستأخذه معتقده أنك أدخلتِ القيمة.

في السطر الرابع ستعود الأمور لطبيعتها.

لست مُتأكّد فعلاً لكن هذا التفسير المنطقي

وضعنا cin.ignore() قبل دالة getline كي نتجاهل تلك الـ"n\". يُمكنك أيضاً إستبدال دالة getline بـcin كحل آخر.

تم تعديل هذه المشاركة بواسطة Mr.B في 17 مايو 2012 في 22:29

#7
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

void f(int R, int N, string P1, string P2);

int main()
{
    int r, n;
    string p1, p2;

    while (1)
    {
        cout << "Enter r  : ";  cin >> r;

        cout << "Enter n  : "; cin >> n;        
        cin.ignore();
        cout << "Enter p1 : ";   getline(cin, p1);
        p1.erase(remove(p1.begin(), p1.end(), '\"'), p1.end());

        cout << "Enter p2 : ";   getline(cin, p2);
        p2.erase(remove(p2.begin(), p2.end(), '\"'), p2.end());       

        f(r, n, p1, p2);
        p2.clear();
        p1.clear();        
    }
    return 0;
}

void f(int R, int N, string P1, string P2)
{
    cout << "r  = " << R << endl;
    cout << "n  = " << N << endl;
    cout << "p1 = " << P1 << endl;
    cout << "p2 = " << P2 << endl;
}

المخرجات:

Enter r  : 1
Enter n  : 1
Enter p1 : mohammed "dddddddddf"
Enter p2 : sdfsdfsdfsdfs"ss
r  = 1
n  = 1
p1 = mohammed dddddddddf
p2 = sdfsdfsdfsdfsss
Enter r  : 2
Enter n  : 4
Enter p1 : ssdflskdjfsl
Enter p2 : sdk""""""ddddd
r  = 2
n  = 4
p1 = ssdflskdjfsl
p2 = sdkddddd

والله من وراء القصد

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#8
Mr.B كتب:

جربي هذا الكُود :

#include<iostream>
#include<string>
#include<algorithm>
using namespace std ;

void f(int R , int N, string P1,string P2);

int main() {

    int r;
    int n;
    string p1;
    string p2;

    while( 1 == 1 ) {
        cout << "Enter r  : ";
        cin >> r;

        cout << "Enter n  : ";
        cin >> n;

        cin.ignore();

        cout << "Enter p1 : ";
        getline(cin, p1);
        p1.erase( remove(p1.begin(), p1.end(), '\"'), p1.end() );

        cout << "Enter p2 : ";
        getline(cin, p2);
        p2.erase( remove(p2.begin(), p2.end(), '\"'), p2.end() );

        f(r,n,p1,p2);
        cin.clear();
    }
    return 0 ;
}

void f(int R , int N, string P1,string P2) {
    cout << "r  = " << R << endl;
    cout << "n  = " << N << endl;
    cout << "p1 = " << P1 << endl;
    cout << "p2 = " << P2 << endl;
}

حسبما أتوقّع أن سبب الخلل في برنامجك هُنا (إذا أهملنا بعض الأجزاء):

        cin>>r ;
        cin>> n ;
        getline(cin,p1);
        getline(cin,p2) ;

تفسيري لما يحديث :

في السطر الاوّل ستدخلين قيمة, والدالة cin ستأخذ ماتدخلين قبل "n\" وستبقى "n\" في الـstdin وهو فعلياً نوع خاص من الأجهزة يُمكنك قرأته كملف. لو كنت تستخدمين أحد أنظمة Unix ستجدينه على المسار :

/dev/stdin

إنظري لبرنامج الـC هذا:

#include<stdio.h>

int main(void) {

    FILE* file;
    file    = fopen("/dev/stdin", "r");

    char buffer[6];

    fread(buffer, sizeof(char), 5, file );
    fclose(file);

    buffer[6]   = '\0';
    printf("%s\n", buffer);

    return(0);
}

عند تشغيله :

$ gcc test_stdin.c

$ ./a.out

aaaaaaaaaaaaaaaa

aaaaa

$

ﻻحظي أنني لم أستخدم اي دالة قرأة من المُستخدم ورغم هذا قرأت مُدخلات المستخدم عن طريق قرأءة هذا الجهاز (ﻻ أعلم بشأن ويندوز ولكن حتماً الأمور تستير بنفس الطريقة).

في السطر الثاني, الدالة cin ستنظف مابقي من الإدخال السابق وتنتظر حتّى تدخلين قيمة ثُم ستأخذ ماتدخلين قبل "n\" (وستبقى "n\" في الـstdin).

في السطر الثالث سيحدث الخلل حيث ستقرأ الدالة getline الـstdin وستنظر حتى تُصادف "n\" , ﻻتُنظف مابقي من المُدخلات السابقة, وستجد أن هناك "n\" واحد , من الإدخال السابق, وستأخذه معتقده أنك أدخلتِ القيمة.

في السطر الرابع ستعود الأمور لطبيعتها.

لست مُتأكّد فعلاً لكن هذا التفسير المنطقي

وضعنا cin.ignore() قبل دالة getline كي نتجاهل تلك الـ"n\". يُمكنك أيضاً إستبدال دالة getline بـcin كحل آخر.

جزآكـ الله خير أشتغل البرنامج الحمدالله وعرفت سبب المشكلة من شرحكـ جزآك الله خير فعلا الله يسر لكـ أمورهآ جميعا ^^

AudaNix كتب:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

void f(int R, int N, string P1, string P2);

int main()
{
    int r, n;
    string p1, p2;

    while (1)
    {
        cout << "Enter r  : ";  cin >> r;

        cout << "Enter n  : "; cin >> n;        
        cin.ignore();
        cout << "Enter p1 : ";   getline(cin, p1);
        p1.erase(remove(p1.begin(), p1.end(), '\"'), p1.end());

        cout << "Enter p2 : ";   getline(cin, p2);
        p2.erase(remove(p2.begin(), p2.end(), '\"'), p2.end());       

        f(r, n, p1, p2);
        p2.clear();
        p1.clear();        
    }
    return 0;
}

void f(int R, int N, string P1, string P2)
{
    cout << "r  = " << R << endl;
    cout << "n  = " << N << endl;
    cout << "p1 = " << P1 << endl;
    cout << "p2 = " << P2 << endl;
}

المخرجات:

Enter r  : 1
Enter n  : 1
Enter p1 : mohammed "dddddddddf"
Enter p2 : sdfsdfsdfsdfs"ss
r  = 1
n  = 1
p1 = mohammed dddddddddf
p2 = sdfsdfsdfsdfsss
Enter r  : 2
Enter n  : 4
Enter p1 : ssdflskdjfsl
Enter p2 : sdk""""""ddddd
r  = 2
n  = 4
p1 = ssdflskdjfsl
p2 = sdkddddd

والله من وراء القصد

جزآك الله كل خير أستاذي ما قصرت أكرمتني من فضلكـ وعلمكـ الله يفتح عليكـ يآآآرب ^ـ^

مواضيع مشابهة