简体   繁体   中英

Implement Scrolling text in C

I was asked this question in one of my interviews with a MNC recently. The question was

"We need to display a screen in which a text scrolls at the bottom of the screen and the remaining screen is empty . How would you accomplish this in C ? What data structures would you use ..??"

Any ideas please ...!

Assuming this is a console application, you could print new lines some 24 times, which puts you at the bottom.

The string to be printed gets stored on fixed size array/vector of 81 chars (\\0 terminated at position 81), which gets updated by some feeding routine. This could potentially come from a socket, typing, a file, calling process, etc...

At feeding time (timer callbacks, when file changes, socket buffer not empty, whatever), you then need to rotate text one char at a time. Assuming rotation is right to left, copy all chars from 1 (not 0) till 80 to i-1 preceding position. Write the new char on position 80.

The key graphical trick here would be to terminate your printf with \\r instead of \\n. \\r is a modifier for return carriage : cursor returns to column 0, and will not go to the next line. That allows re-print of the same line.

You have to shift all the characters to right side of the screen in every iteration. You can use memmove for this.

1. create a buffer of the required size based on the horizontal space in the screen 
2.print required the number of '\n' to go to the bottom of the screen
    while(1)
    {
        3.add appropriate delay
        4./*use memmove to shift all the char to right side of screen*/
        memmove(buffer+1, buffer, horizondal_size - 2);

        5.add the new character to the starting of the buffer. add '\0' to the last position in the buffer (horizondal_size - 1)

        6./*print the buffer with carriage return, then  flush the output*/
        printf("%s\r",buffer);
        fflush(stdout);

}

Making a number of assumptions of which you should make the interviewer aware or ask them about:

Place the text in a circular buffer, from the current index print n characters where n is the console width. Print a '\\r' to return to the start of the same line. After a time interval, increment the buffer index and repeat.

So the data structure they may have been angling for is a circular or ring buffer

Without any console library other than stdio, you would get to the bottom of the blank screen simply by printing h newlines, where h is >= the console height

first question is good..but it doesnt provide as much info.

there are may other ways..but im telling you that u can make this in BGI Graphics used in Borland Compilers...

you can do following:

Simple just put a narrow bar(length is less then height of screen) at the right side of the screen..and then u have to enable Mouse pointer by Using Interrupt...one more thing the color of the scroll bar should be different from background...and now take the mouse pointer to the bar and just apply getPixel(x,y) func. (here x and y are coordinate of mouse pointer)..
it will give u the color of that perticular pixel and compare it with ur color of the scroll bar...if it matches then u got the scroll bar..and u can move upward and downward ...

and u can use Linked List in this...

if u need any help with BGI..let me know..thanx...

When I had to make it in my C end-of-year project around 3-4 years ago, I remmber that I used Two-Sided Linked List to support forward and backward scrolling. Vert and Horz implementations. How does it implements : each "Page" is a diffrent node in the Linked-List which saves pointer to previous page and next page. setting currsor position is pure math calcs.

I'm sure that it is not the best way, but it is a way.

Hope that it helped,

Ran.

This could work.

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
     //library for sleep() function
    #include <unistd.h>

    void main()
    {
     int i,j,n,k;

    //text to be srolled
     char t[30]="akhil is a bad boy";
     n=strlen(t);
     for(i=0;i<n;i++)
     {
        printf("\n");
//loop for printing spaces
        for(j=20-i;j>0;j--)
        {
            printf(" ");
        }

/*printing text by adding a character every time*/
        for(k=0;k<=i;k++)
        {
            printf("%c",t[k]);
        }
// clearing screen after every iteration
        sleep(1);
        if(i!=n-1)
        clrscr();

     }


    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM