دریافت رشته با scanf بدون فاصله

farik

Well-Known Member
با سلام...
خوب نمیدونم دوستان چقدر در جریان کار بنده هستن ولی من تازه c++ رو تا حد مقدماتی یاد گرفتم..اگرچه قبلش زبانهای سرور ساید و اسکریپتی رو زیاد کار کرده بودم ...واسه همین محدودیت های c++ خیلی اذیتم میکنه..:-?..مثلا چطوری من میتونم با scanf از ورودی رشته بگیرم به طوری ورودی ها رو با فاصله رو چند تا ورودی حساب نکنه...توجه کنین که من %[^\n] رو امتحان کردم و جواب نداد...
مشتاقانه منتظر پاسخ دوستانم...
با تشکر..
 

the_king

مدیرکل انجمن
با سلام...
خوب نمیدونم دوستان چقدر در جریان کار بنده هستن ولی من تازه c++ رو تا حد مقدماتی یاد گرفتم..اگرچه قبلش زبانهای سرور ساید و اسکریپتی رو زیاد کار کرده بودم ...واسه همین محدودیت های c++ خیلی اذیتم میکنه..:-?..مثلا چطوری من میتونم با scanf از ورودی رشته بگیرم به طوری ورودی ها رو با فاصله رو چند تا ورودی حساب نکنه...توجه کنین که من %[^\n] رو امتحان کردم و جواب نداد...
مشتاقانه منتظر پاسخ دوستانم...
با تشکر..

scanf هر جا که کاراکتر های White-Space رو ببینه دریافت ورودی رو خاتمه میده. شما باید از تابع هایی استفاده کنید
که White-Space ها رو جزو ورودی فرض کنند. برای دریافت کردن رشته ای که داخلش انواع کاراکتر های White-Space
هست یا باید از gets یا fgets و یا getline استفاده کنید که آخری مربوط به شی گرایی در ++C است و در C نیست.

مثالی که با استفاده از fgets رشته از ورودی دریافت می کنه :
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char s[100];
    printf("Please enter a text (s) :");
[B][COLOR="Blue"]    fgets(s, 100, stdin);[/COLOR][/B]
    printf ("\n s = %s", s);
    getch();
    return 0;
}

مثالی که با استفاده از gets رشته از ورودی دریافت می کنه :
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char s[100];
    printf("Please enter a text (s) :");
[B][COLOR="Blue"]    gets(s);[/COLOR][/B]
    printf ("\n s = %s", s);
    getch();
    return 0;
}

مثالی که با استفاده از getline رشته از ورودی دریافت می کنه :
کد:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>

int main()
{
    char s[100];
    printf("Please enter a text (s) :");
[B][COLOR="Blue"]    cin.getline(s, 100);[/COLOR][/B]
    printf ("\n s = %s", s);
    getch();
    return 0;
}

در ضمن اگر از gets یا fgets یا getline استفاده کردید باید قید scanf را بزنید ، چون با هم کنار نمی آیند. :green:
دلیلش این است که scanf مقدار ورودی را از بافر می خواند و حذف می کند اما کاراکتر انتهای سطر n\
را در بافر ورودی حذف نمی کند (موقعی که Enter را فشار دادید).
اگر بعد از آن fgets یا gets یا getline اجرا شود، اولین ورودی که از بافر می خواند همان کاراکتر انتهای سطر
است که از قبل باقی مانده و دیگر منتظر متن ورودی دیگری نمی شود و بلافاصله اجرایش را تمام می کند.

مثلا کد زیر آنطور که انتظار داریم اجرا نمی شود، چون بعد از دریافت کردن x سریع سراغ y می رود و منتظر
ورودی s نمی شود :
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char s[100];
    int x, y;
    printf("Please enter a number (x) :");
    scanf("%d", &x);
    printf("Please enter a text (s) :");
[B][COLOR="DarkOrange"]    gets(s);[/COLOR][/B]
    printf("Please enter a number (y) :");
    scanf("%d", &y);
    printf ("\n x * y = %d", x * y);
    getch();
    return 0;
}

خوشبختانه راه حل دشوار نیست :
همیشه بعد از دستورات scanf بافر ورودی را بطور کامل خالی کنید، fflush در stdio.h تعریف شده :
کد:
    scanf("%d", &x);
    fflush(stdin);
اینطوری هر آنچه که scanf از بافر نخوانده حذف می شود و انگار کاربر هیچ ورودی اضافه ای وارد نکرده.
در نتیجه هر دستور دیگری که بعد از آن بخواهد از بافر مقدار دریافت کند کاراکتر اضافی n\ نمی بیند.

مثال کامل که مشکل اش با اضافه کردن یک fflush رفع شده :
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char s[100];
    int x, y;
    printf("Please enter a number (x) :");
    scanf("%d", &x);
[B][COLOR="Blue"]    fflush(stdin);[/COLOR][/B]
    printf("Please enter a text (s) :");
    gets(s);
    printf("Please enter a number (y) :");
    scanf("%d", &y);
    printf ("\n x * y = %d", x * y);
    getch();
    return 0;
}
 

farik

Well-Known Member
باسلام..
واقعا ممنون از توضیحات....یعنی هیچ راهی نیست که با scanf اینکار رو کرد..؟...
با تشکر..
 

the_king

مدیرکل انجمن
باسلام..
واقعا ممنون از توضیحات....یعنی هیچ راهی نیست که با scanf اینکار رو کرد..؟...
با تشکر..

حالا چه اصراری یه که فقط از scanf استفاده کنید؟

کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char s[100];
    printf("Please enter a text (s) :");
[B][COLOR="Blue"]    scanf("%100[^\n]", s);[/COLOR][/B]
    printf ("\n s = %s", s);
    getch();
    return 0;
}
 

farik

Well-Known Member
سلام..
خوب همین روش کار کردم و ورودی بهم نمیداد...و وقتی هم چاپ میکردم محتویات قبلیه اشاره گر رو میداد...
تازه من که گیر ندادم..استاد گیر داده...وگرنه کی حال داره که scanf و printf از ورودی داده بگیره:دی..
باتشکر..
 

جدیدترین ارسال ها

بالا