鱼C论坛

 找回密码
 立即注册
查看: 770|回复: 11

电子屏字符循环播出

[复制链接]
发表于 2020-8-2 20:00:37 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 风过无痕1989 于 2020-10-8 09:07 编辑

       学习C语言满一个月了,我用最笨的办法写了下面这段代码,实现了英文的滚动播出 (中文字进入没问题,退出时是乱码)。之前发了一个求助帖,希望得到优化,问题没有解决,已经结帖了,撤不回来了。由于此程序能够正常运行,再发求助有点不合适,故而发技术交流(当然,我自知此程序没有技术含量),算抛砖引玉吧

// 电子屏字符循环播出

#include<stdio.h>
#include<windows.h>

int main()

{
          char str[26];
          char strk[26];
          char *p1 = str;
          char *p2 = strk;
          int i,j,k,m = 32,n =97;
          int len = sizeof(strk) / sizeof(char);
          for (i = 0;i < len ;i++)                                   // 数组 str 全部格式化为空格
          {
                  str[ i ] = m;
          }
          for (i = 0;i < len;i++)
          {
                  strk[ i ] = n;
                  n += 1;
          }
          
         while (1)
          {
                  
          p2 = strk;
                  for (k = 0;k < len;k++)                       // 电子屏输出总字符数控制
                  {
                          for (i = 0;i < len - k;i++)              // 输出空格数
                          {
                                  printf("%c",*(p1 + i));
                          }
                          for (j =0;j <= k;j++)                    // 输出字符数
                          {
                                  printf("%c",*(p2 + j));
                          }
                  Sleep(300);
                  system("cls");
                  }
                                    
                  for (k = 0;k < len;k++)                     // 电子屏输出总字符数控制
                  {
                          for (i = 1;i < len - k;i++)              // 输出字符数
                          {
                                  printf("%c",*(p2 + i));
                          }
                          
                  Sleep(300);
                  p2 += 1;
                  system("cls");
                  }
          }
          printf("\n");
          
}


PS:发帖时变成了斜体,看着难受,故而改之;同时将越界多出来的一个字符去掉了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-2 20:27:19 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<windows.h>

  3. int main()
  4. {
  5.         char str[26];
  6.         char strk[26];
  7.         char *p1 = str;
  8.         char *p2 = strk;
  9.         int i,j,k,m = 32,n =97;
  10.         int len = sizeof(strk) / sizeof(char);
  11.         for (i = 0;i < len ;i++)// 数组 str 全部格式化为空格 i=len=26时数组越界
  12.         {
  13.                 str[i] = m;
  14.         }
  15.         for (i = 0;i < len;i++) // 同上 又越界了 len=i=26
  16.         {
  17.                 strk[i] = n;
  18.                 n += 1;
  19.         }     
  20.           
  21.         while (1)
  22.         {
  23.                   
  24.                 p2 = strk;
  25.                 for (k = 0;k < len;k++)// 电子屏输出总字符数控制 0-25 // 当k=len时下面循环会越界
  26.                 {
  27.                         for (i = 0;i < len - k;i++)//i<=len-k越界加1            // 输出空格数
  28.                         {
  29.                                 printf("%c",*(p1 + i));
  30.                         }
  31.                         for (j = 0;j <= k;j++)                    // 输出字符数
  32.                         {
  33.                                 printf("%c",*(p2 + j));
  34.                         }
  35.                         Sleep(300);
  36.                         system("cls");
  37.                 }
  38.                                     
  39.                 for (k = 0;k < len;k++)                     // 电子屏输出总字符数控制
  40.                 {
  41.                         for (i = 1;i < len - k;i++)              // 输出字符数
  42.                         {
  43.                                 printf("%c",*(p2 + i));
  44.                         }
  45.                            
  46.                         Sleep(300);
  47.                         p2 += 1;
  48.                         system("cls");
  49.                 }
  50.         }
  51.         printf("\n");
  52.        
  53.         return 0;
  54. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-2 21:40:02 | 显示全部楼层

兄弟,越界不是大问题,大问题是我认为一定会有更好的,更优的算法来写此程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-2 23:04:23 | 显示全部楼层
// 电子屏字符循环播出
#include <stdio.h>
#include<windows.h>
#define w 36                                                // 定义电子屏的宽度
#define kg 10                                              // 定义中间的空格数量

int main()
{
       char str[w];
       char *p;
       int i,j;

       for(i = 0;i < w;i++)                                 //数组内有 w - kg 个空格
      {
           if(0 <= i && i < kg)
                str[i]=32;
          else
               str[i] = i - kg + 'a';
      }

    for(i = 0;i < 1000;i++)                           //这里i的最大值随便设,就是个循环次数
    {
        p = str;
        for(j = 0;j < w;j++)
        {
            printf("%c",*(p + (i + j) % w));     //这里是对要显示的数组长度求余
        }
        Sleep(300);
        system("cls");
    }
    return 0;
   
}

      此方法的优点是少用了一个数组,节约了系统资源,定义了数组长度及空格数量,只需对定义部份进行修改,程序部份可以基本不动。缺点是很难调到前面的刚好出屏,后面的接着显示(我调试了几个小时了,也没有能够达到如上面的程序那样)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 00:11:38 | 显示全部楼层
如果是刚好出屏后面接着显示,那不应该是调整sleep的时间么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-3 00:14:23 | 显示全部楼层
BIYU 发表于 2020-8-3 00:11
如果是刚好出屏后面接着显示,那不应该是调整sleep的时间么

sleep 是用来刷屏的,让字符一个一个出来有钝错感
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 15:11:55 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-3 16:11 编辑

#BUG 中文字,最后还是会打印!


  1. // 电子屏字符循环播出
  2. #include <stdio.h>
  3. #include<windows.h>
  4. #include<locale.h>
  5. #define w 36                                                // 定义电子屏的宽度
  6. #define kg 10                                              // 定义中间的空格数量

  7. int main()
  8. {
  9.        char str[100] = "C语言最牛逼_COOL_BREEZE";
  10.        char *p;
  11.        register int i,j;

  12. //       for(i = 0;i < w;i++)                                 //数组内有 w - kg 个空格
  13. //      {
  14. //           if(0 <= i && i < kg)
  15. //                str[i]=32;
  16. //          else
  17. //               str[i] = i - kg + 'a';
  18. //      }

  19.     for(i = 0;i <1000 ;i++)                           //这里i的最大值随便设,就是个循环次数
  20.     {
  21.             p = str + i % w;
  22.                 if (*p < 0)
  23.                 {
  24.                         printf("%c%c",*p,*(p+1));
  25.                         i++;
  26.                         j=1;
  27.                 }
  28.                 else j=0;
  29.         for(;j < w;j++)
  30.         {
  31.                 p = str + (i + j) % w;
  32.                 if (*p < 0)
  33.                         {
  34.                                 printf("%c%c",*p,*(p+1));     //这里是对要显示的数组长度求余
  35.                                 j++;
  36.                         }                   
  37.                         else printf("%c",*p);
  38.         }
  39.                 Sleep(100);
  40.         //system("pause >nul");
  41.         system("cls");
  42.         }

  43.     return 0;
  44.    
  45. }
复制代码

这样最好了!

  1. // 电子屏字符循环播出
  2. #include <stdio.h>
  3. #include<windows.h>
  4. #define w 36                                                // 定义电子屏的宽度
  5. #define kg 10                                              // 定义中间的空格数量

  6. int main(void)
  7. {
  8.         static char str[100][3] = {"C","语","言","最","牛","逼","_","C","O","O","L","_","B",\
  9.         "R","E","E","Z","E"};
  10.         register int i,j;
  11.         for (i=0; i<w; i++) if (! *str[i]) strcpy(str[i], " ");
  12.         for(i = 0;i <1000 ;i++)                           //这里i的最大值随便设,就是个循环次数
  13.         {
  14.                 printf("\r");
  15.                 for(j=0;j < w;j++) printf("%s",*(str + (i + j) % w));
  16.                 Sleep(300);
  17.                 //system("pause >nul");
  18.         }
  19.     return 0;
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 16:56:42 From FishC Mobile | 显示全部楼层
使用宽字符 wchar_t
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-3 16:59:31 | 显示全部楼层
Cool_Breeze 发表于 2020-8-3 15:11
#BUG 中文字,最后还是会打印!

前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着很舒服。但你这么灌文字进去,对用户来说,有点麻烦。比如我要写一句话,就得这样了:{"学","习","C","语","言","满","一","个","月",",","感","谢","小",\
"甲","鱼","老","师","的","精","淇","讲","解",",","感","谢","论",\
"坛","朋","友","们","的","热","心","帮","助","!"};

若是话语再长一点,用户可能要崩溃了。
还有,最好是前一句正好退出屏幕,后一句才开始进入,就像银行、医院等一些服务性行业的电子横幅那样,就最好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-3 17:03:37 | 显示全部楼层
风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...

我也是去银行,看见了,就想自己写一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 18:25:12 | 显示全部楼层
风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...

这个需要分割字符串放入数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 18:43:13 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-3 18:52 编辑
风过无痕1989 发表于 2020-8-3 16:59
前后两个我都试了,前面那一个,文字移动时跳跃太大了,让人看着有不舒适感;后面这个这就好很多了,看着 ...

  1. // 设1个中文占2个字符
  2. // 电子屏字符循环播出
  3. #include <stdio.h>
  4. #include<windows.h>
  5. #define w 36                                                // 定义电子屏的宽度
  6. #define kg 10                                              // 定义中间的空格数量

  7. int main(void)
  8. {
  9.     static char str[100][3];
  10.     static char s[1024];
  11.     while (1)
  12.     {
  13.             printf("\r请输入字符串:");
  14.             scanf("%s",s);
  15.             system("cls");
  16.             if (s) break;
  17.            
  18.         }
  19.         register int i=0,j=0;
  20.         char *p = s;
  21.         for (i=0;*p;i++)
  22.         {
  23.                 p = s+i;
  24.                 if (*(s+i) < 0)
  25.                 {
  26.                         strncpy(str[j],p,2);
  27.                         j++;
  28.                         i++;
  29.                 }
  30.                 else
  31.                 {
  32.                         strncpy(str[j],p,1);
  33.                         j++;
  34.                 }
  35.         }
  36.         //printf("%s",str);
  37.    
  38.     for (i=0; i<w; i++) if (! *str[i]) strcpy(str[i], " ");
  39.     for(i = 0;i<=w ;i++)                           //这里i的最大值随便设,就是个循环次数
  40.     {
  41.                     printf("\r");
  42.             for(j=0;j < w;j++) printf("%s",*(str + (i + j) % w));
  43.             Sleep(100);
  44.             if (i==w) i=0;
  45.             //system("pause >nul");
  46.     }
  47.     return 0;
  48. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表