انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 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 از cin استفاده کن
-
خب مشکل کار اینجاست که 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 اول بافر رو نگاه میندازه و اگه مقداری در اونجا وجود داشته باشه همون رو میگیره و برمیگردونه. توی کد شما هم قبل از اجرای این خط:
ans = getchar();
یه /n توی بافر وجود داره. حالا این از کجا اومده؟! دقیقا از اینجا:
scanf("%d", &guess);
تابع scanf اون Enter آخری رو که شما میزنی تا مقدار رو بگیره از بافر برنمیداره و بهمین دلیل getchar اشتباها اون رو از بافر برمیداره.
چاره کار هم خیلی ساده ست:
قبل از خطی که getchar رو انجام میدید یه getchar دیگه بذارید اما خروجیش رو استفاده نکنید. یعنی:
printf("\n Do you want to continue?(y/n): ");
getchar();
ans = getchar();
بهمین راحتی...
جالب بود :) میتونی یکم در مورد بافر توضیح بدی؟ بازم ممنون
-
خواهش میکنم مسئله پیچیدهای نیست. وقتی سرعت ورودی بیشتر از سرعت پردازش باشه همیشه به یه بافر نیاز داریم. در واقع بافر محلی هست برای نگهداری ورودیهایی که توی نوبت پردازش هستند.
در مثال بالا scanf یادش میره \nـی که برای پایان دادن به ورودیهاش از طریق خط فرمان وارده شده رو از بافر برداره و getchar هم ورودیش رو بصورت پیشفرض از بافر انتخاب میکنه...
-
ممنونم دوست عزیز. درست کار کرد. 8)