【问题标题】:Implement Scrolling text in C在 C 中实现滚动文本
【发布时间】:2010-07-24 09:23:13
【问题描述】:

我最近在一次跨国公司的采访中被问到这个问题。问题是

“我们需要显示一个屏幕,其中一个文本在屏幕底部滚动,而剩余的屏幕是空的。你将如何在 C 中实现这一点?你会使用什么数据结构..??”

任何想法请...!

【问题讨论】:

  • 水平还是垂直?固定文本还是不断变化的文本?仅 ISO C 库还是特定的控制台 API?这甚至是控制台问题还是 GUI?可能需要更多上下文。
  • 这个问题说得不好,如果没有一些上下文几乎不可能回答,例如,程序运行在什么样的 UI 环境中(Unix、Windows、Curses?)。在一家大公司的面试题库中发现这样的问题,我会有些惊讶。
  • 是的,这是一个很好的问题,因为面试的一部分可能是确定候选人与业务用户交互以帮助澄清需求的能力,!之前!回答问题...
  • 水平从右到左在屏幕底部
  • 这是一个使用标准 C 库的控制台应用程序。它用于文件中的文本。

标签: c data-structures


【解决方案1】:

假设这是一个控制台应用程序,您可以打印新行大约 24 次,这会将您置于底部。

要打印的字符串存储在 81 个字符的固定大小数组/向量中(\0 终止于位置 81),通过一些馈送例程进行更新。这可能来自套接字、键入、文件、调用进程等......

在馈送时间(计时器回调、文件更改时、套接字缓冲区不为空等),您需要一次将文本旋转一个字符。假设旋转是从右到左,将所有字符从 1(不是 0)复制到 80 到 i-1 前面的位置。在位置 80 上写入新字符。

这里的关键图形技巧是用 \r 而不是 \n 来终止你的 printf。 \r 是 回车 的修饰符:光标返回到第 0 列,不会转到下一行。这允许重新打印同一行。

【讨论】:

    【解决方案2】:

    您必须在每次迭代中将所有字符移动到屏幕右侧。您可以为此使用 memmove。

    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);
    
    }
    

    【讨论】:

      【解决方案3】:

      第一个问题很好..但它没有提供那么多信息。

      可能还有其他方法......但我告诉你,你可以在 Borland 编译器中使用的 BGI 图形中制作这个......

      您可以执行以下操作:

      简单的只是在屏幕右侧放一个窄条(长度小于屏幕高度)..然后你必须通过使用中断来启用鼠标指针...还有一件事是滚动条的颜色应该与背景不同...现在将鼠标指针指向栏并应用getPixel(x,y) func。 (这里 x 和 y 是鼠标指针的坐标)..
      它将为您提供该特定像素的颜色并将其与滚动条的颜色进行比较...如果匹配,则您获得了滚动条..您可以向上和向下移动...

      您可以在此使用链接列表...

      如果您在 BGI 方面需要任何帮助..请告诉我..thanx...

      【讨论】:

        【解决方案4】:

        做出一些假设,你应该让面试官知道或询问他们:

        将文本放入循环缓冲区,从当前索引打印 n 个字符,其中 n 是控制台宽度。打印 '\r' 以返回到同一行的开头。一段时间后,增加缓冲区索引并重复。

        所以他们可能一直在寻找的数据结构是循环或环形缓冲区

        除了 stdio 之外没有任何控制台库,您只需打印 h 换行符就可以到达空白屏幕的底部,其中 h 是 >= 控制台高度

        【讨论】:

          【解决方案5】:

          大约 3 到 4 年前,当我不得不在我的 C 年终项目中实现它时,我记得我使用双向链表来支持向前和向后滚动。 Vert 和 Horz 实现。 它是如何实现的:每个“页面”都是链接列表中的一个不同节点,它保存指向上一页和下一页的指针。 设置光标位置是纯数学计算。

          我确信这不是最好的方法,但它是一种方法。

          希望对你有所帮助,

          跑。

          【讨论】:

            【解决方案6】:

            这可以工作。

                #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();
            
                 }
            
            
                }
            

            【讨论】:

              猜你喜欢
              • 2015-03-30
              • 1970-01-01
              • 2021-05-19
              • 1970-01-01
              • 2010-10-14
              • 1970-01-01
              • 2011-07-28
              • 2011-10-18
              • 1970-01-01
              相关资源
              最近更新 更多