انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: چرا getchar از ورودی چیزی نمی گیره؟  (دفعات بازدید: 1461 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
چرا getchar از ورودی چیزی نمی گیره؟
« : 07 شهریور 1392، 05:43 ق‌ظ »
سلام دوستان

من یه برنامه دارم وقتی اجراش می کنم اون خطی که باید از یوزر بوسیله تابع getchar یه کاراکتر از ورودی بگیره این کاره رو انجام نمی ده. بعد از دیباگ کردن فهمیدن مقدار \n  رو در متغیر ans می ریزه. کسی از دوستان می تونه کمک کنه که چرا این تابع این مقدار رو برمی گردونه.

#include<stdio.h>
#include<stdlib.h>

int main(void){
  int magic, guess;
  char ans = 'y';

  magic = rand(); // get a random number and put it in 'magic' variable

  do{
    printf("\nGuess the magic number:");
    scanf("%d", &guess);
    if(guess == magic){
      printf("\n *** right ***");
      printf("\n %d is the magic number.", magic);
      ans = 'n';
    }
    else{
      printf("\n *** wrong ***");
      if(guess > magic)
        printf("\n your guess is too high.");
      else
        printf("\n your guess is too low.");

      printf("\n Do you want to continue?(y/n): ");
      ans = getchar();
    } // end of else
  }while(ans == 'y'); // end of while

  return 0;
}

اجرای برنامه به این شکله:
amin@linuxbox:~/C$ gcc questions/guess-number.c
amin@linuxbox:~/C$ ./a.out

Guess the magic number:43

 *** wrong ***
 your guess is too low.
 Do you want to continue?(y/n): amin@linuxbox:~/C$
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *

آفلاین ahmad511800

  • Sr. Member
  • *
  • ارسال: 413
    • اخبار استخدامی
پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
« پاسخ #1 : 07 شهریور 1392، 08:49 ق‌ظ »
بجای getchar از cin استفاده کن
Ewrek reşî le ser me da tê

Degurrmiji dewê merev bihar tê

آفلاین vandu

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
« پاسخ #2 : 07 شهریور 1392، 10:12 ق‌ظ »
خب مشکل کار اینجاست که getchar اول بافر رو نگاه میندازه و اگه مقداری در اونجا وجود داشته باشه همون رو می‌گیره و برمی‌گردونه. توی کد شما هم قبل از اجرای این خط:
ans = getchar();یه ‎/n توی بافر وجود داره. حالا این از کجا اومده؟! دقیقا از اینجا:
scanf("%d", &guess);تابع scanf اون Enter آخری رو که شما میزنی تا مقدار رو بگیره از بافر برنمی‌داره و بهمین دلیل getchar اشتباها اون رو از بافر برمیداره.
چاره کار هم خیلی ساده ست:
قبل از خطی که getchar رو انجام می‌دید یه getchar دیگه بذارید اما خروجی‌ش رو استفاده نکنید. یعنی:
printf("\n Do you want to continue?(y/n): ");
getchar();
ans = getchar();
بهمین راحتی...
Nothing is particularly hard if you divide it into small jobs

Henry Ford

آفلاین سالار مقدم

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 2074
  • جنسیت : پسر
  • هر چقدر بدونی بازم کمه.
    • سالار مقدم
پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
« پاسخ #3 : 07 شهریور 1392، 11:11 ق‌ظ »
خب مشکل کار اینجاست که getchar اول بافر رو نگاه میندازه و اگه مقداری در اونجا وجود داشته باشه همون رو می‌گیره و برمی‌گردونه. توی کد شما هم قبل از اجرای این خط:
ans = getchar();یه ‎/n توی بافر وجود داره. حالا این از کجا اومده؟! دقیقا از اینجا:
scanf("%d", &guess);تابع scanf اون Enter آخری رو که شما میزنی تا مقدار رو بگیره از بافر برنمی‌داره و بهمین دلیل getchar اشتباها اون رو از بافر برمیداره.
چاره کار هم خیلی ساده ست:
قبل از خطی که getchar رو انجام می‌دید یه getchar دیگه بذارید اما خروجی‌ش رو استفاده نکنید. یعنی:
printf("\n Do you want to continue?(y/n): ");
getchar();
ans = getchar();
بهمین راحتی...
جالب بود :) میتونی یکم در مورد بافر توضیح بدی؟ بازم ممنون

آفلاین vandu

  • Hero Member
  • *
  • ارسال: 741
  • جنسیت : پسر
پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
« پاسخ #4 : 07 شهریور 1392، 12:31 ب‌ظ »
خواهش می‌کنم مسئله پیچیده‌ای نیست. وقتی سرعت ورودی بیشتر از سرعت پردازش باشه همیشه به یه بافر نیاز داریم. در واقع بافر محلی هست برای نگهداری ورودی‌هایی که توی نوبت پردازش هستند.
در مثال بالا scanf یادش میره ‎\nـی که برای پایان دادن به ورودی‌هاش از طریق خط فرمان وارده شده رو از بافر برداره و getchar هم ورودیش رو بصورت پیش‌فرض از بافر انتخاب می‌کنه...
Nothing is particularly hard if you divide it into small jobs

Henry Ford

آفلاین amin-asa

  • Full Member
  • *
  • ارسال: 161
  • جنسیت : پسر
پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
« پاسخ #5 : 07 شهریور 1392، 01:35 ب‌ظ »
ممنونم دوست عزیز. درست کار کرد.  8)
* زندگی خالی نیست *
* مهربانی هست، سیب هست، ایمان هست *
* آری تا شقایق هست، زندگی باید کرد *