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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: amin-asa در 07 شهریور 1392، 05:43 ق‌ظ

عنوان: چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: amin-asa در 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$
عنوان: پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: ahmad511800 در 07 شهریور 1392، 08:49 ق‌ظ
بجای getchar از cin استفاده کن
عنوان: پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: vandu در 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();
بهمین راحتی...
عنوان: پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: سالار مقدم در 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();
بهمین راحتی...
جالب بود :) میتونی یکم در مورد بافر توضیح بدی؟ بازم ممنون
عنوان: پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: vandu در 07 شهریور 1392، 12:31 ب‌ظ
خواهش می‌کنم مسئله پیچیده‌ای نیست. وقتی سرعت ورودی بیشتر از سرعت پردازش باشه همیشه به یه بافر نیاز داریم. در واقع بافر محلی هست برای نگهداری ورودی‌هایی که توی نوبت پردازش هستند.
در مثال بالا scanf یادش میره ‎\nـی که برای پایان دادن به ورودی‌هاش از طریق خط فرمان وارده شده رو از بافر برداره و getchar هم ورودیش رو بصورت پیش‌فرض از بافر انتخاب می‌کنه...
عنوان: پاسخ : چرا getchar از ورودی چیزی نمی گیره؟
ارسال شده توسط: amin-asa در 07 شهریور 1392، 01:35 ب‌ظ
ممنونم دوست عزیز. درست کار کرد.  8)