برنامه نویسی C در لینوکس

برای انجام بخشی از یک پروژه نیاز بود تا از زبان سی استفاده کنم. برای مرور این زبان به کتاب جعفر نژاد قمی که از دوران دانشگاه (سال ۱۳۸۷) برام به یادگار مونده بود رجوع کردم. اون زمان از ویندوز و کامپایلر turbo-C استفاده میکردم. این کامپایلر از هدر <conio.h> پشتیبانی میکرد. اما در کامپایلر GCC این کتابخانه در دسترس نیست. در نتیجه ما در لینوکس به توابعی مانند gotoxy , clrscr و getche و getch دسترسی نداریم. خب من میخوام در این نوشته نحوه تعریف این توابع رو به شما آموزش بدم.


تابع gotoxy برای GCC Linux

گاهی ممکنه نیاز باشه در صفحه ی خروجی مکان نما رو به نقطه ی خاصی انتقال بدیم. برای این منظور از تابع gotoxy استفاده میشه. الگوی این تابع در فایل conio.h وجود داره که همونطور که گفته شد در لینوکس پشتیبانی نمیشه. خب پس ما میتونیم این تابع رو خودمون تعریف کنیم. برای تعریف این تابع به شرح زیر عمل کنید:

//gotoxy() function definition
void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}‍‍

خب یه مثالش این میتونه باشه:

#include<stdio.h>

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}


int main ()
{
    int x=10, y=20;
    gotoxy(x,y); 
    printf("my email is: sh4rifi@gmail.com!"); 
    return 0;
}

خروجی:

تابع clrscr برای GCC Linux

برای پاک کردن اسکرین ما میتونیم از دستورات ترمینال لینوکس استفاده کنیم:

#include<stdio.h>
//clrscr() function definition
void clrscr(void)
{
    system("clear");
}

int main ()
{
    clrscr();   //clear output screen
    printf("Hello. I am sh4rifi!!!"); //print message
    return 0;
}

خروجی:

همانطور که می بینید صفحه ابتدا پاک شد بعد دستورات اجرا شدند.
همانطور که می بینید صفحه ابتدا پاک شد بعد دستورات اجرا شدند.


تابع getch و getche برای GCC Linux

تابع getch عمل خواندن اطلاعات رو بدون اکو انجام میده. یعنی توی اسکرین نمایشش نمیده. تابع getche هم کار تابع getch رو همراه با اکو انجام میده. یعنی کاراکتر وارد شده رو در اسکرین چاپ میکنه.

به مثال زیر توجه کنید:

#include <termios.h>
#include <stdio.h>

static struct termios old, new;

/* Initialize new terminal i/o settings */
void initTermios(int echo)
{
    tcgetattr(0, &old); //grab old terminal i/o settings
    new = old; //make new settings same as old settings
    new.c_lflag &= ~ICANON; //disable buffered i/o
    new.c_lflag &= echo ? ECHO : ~ECHO; //set echo mode
    tcsetattr(0, TCSANOW, &new); //apply terminal io settings
}

/* Restore old terminal i/o settings */
void resetTermios(void)
{
    tcsetattr(0, TCSANOW, &old);
}

/* Read 1 character - echo defines echo mode */
char getch_(int echo)
{
    char ch;
    initTermios(echo);
    ch = getchar();
    resetTermios();
    return ch;
}

/* 
Read 1 character without echo 
getch() function definition.
*/
char getch(void)
{
    return getch_(0);
}

/* 
Read 1 character with echo 
getche() function definition.
*/
char getche(void)
{
    return getch_(1);
}

int main(void) {
    char c;
    printf("(getche example) Please enter a character: ");
    c = getche();
    printf("\nYou entered: %c\n", c);
    printf("(getch example) Please enter a character: ");
    c = getch();
    printf("\nYou entered: %c\n", c);
    return 0;
}


خروجی: