求助!某公司(日企)的C语言笔试编程题,会做高手帮个忙啊!

时间:2022-07-24 14:37:27
能够读出文本文件指定的某一行显示在屏幕上,进行编辑。
按(←)键光标向左移动一个字符!
按(→)键光标向右移动一个字符!
按(delete)键光标右边的一个字符删除!
按(backspace)键光标左边的一个字符删除!
按 (space)键光标右插入半角空格!
别的数字字母按下光标右插入该字符(要考虑shift键)!
按下ESC键时编辑结束!
注:一行显示不了时,窗口大小固定换行显示!
    光标的动作参考windows的记事本!按上下键光标不能移动!

原文是日语的,我翻译的!意思就是这样!希望高手帮忙!

35 个解决方案

#1


这是一个大工程,帮顶
google记事本的源码

#2


折腾人嘛,dos下的编程问题现在还拿出来。这程序上学学C的人才写,俺当年也写过。

#3


日本人真变态。

#4


无聊的xrb

#5


kankan,

#6


JF

#7


谁知道字符界面下光标怎么移动啊?

#8


纯c编译器用gotoxy就可以

若是用for windows的编译器(vc6.0或tc for windows)的话,可以用windows.h库文件的一个函数实现光标移动
是BOOL   SetConsoleCursorPosition(   
      HANDLE   hConsoleOutput,     //   handle   to   screen   buffer   
      COORD   dwCursorPosition     //   new   cursor   coordinates   
  );   
至于相应键盘觉得直接getchar读取字符就可以了吧?(如果要屏蔽其他按键的话就判断一下吧)
删除字符的话可以把光标移到指定位置printf("");应该可以实现吧!
光标在控制台上应该是自动换行的吧?没用过dos系统,不敢瞎说。

半角空格?是printf(" ")吗?(现在是半角输入法)
考虑shift键的话试一下同时读取两个字符?这个应该不像windows提供的api那么简单吧?
但是个人觉得控制台输入的话貌似已经考虑shift键了,不需要我们在作额外工作了吧?

个人的yy

#9


不会,帮顶!

#10


我建议不要加入这种公司,否则等你在哪混不下去想跳槽难。这么早的技术还搞啥搞

#11


真的是哟 靠他个日本鬼子

#12


参考SciTE源码

#13


不懂

#14


帮顶.等待解答.

#15


帮顶先!对了,LZ就这一道题吗?

#16


 我只有光标左移右移,退格删除的操作,当然了,固定屏幕大小可以换行。可左右移动。可以反函数代码发给你

#17


这样太bt了。

#18


int getInputStr(char *__strInput)
{
   char __cInput;
   int __curStrInput,__nLastCur;
   int x,y; //当前光标位置
   int X,Y; //末位光标位置 
   int i; //循环控制 
   __curStrInput = 0;
   __nLastCur = 0; //字符位数标志 
   while(1)
   {
       wherexy(&x,&y); //获得当前光标位置 
       __cInput = getch();
       if(__cInput > 47 && __cInput < 58 && __nLastCur < M && (__cInput != 48 || __curStrInput != 0))
       //长度允许范围内录入字符为'0'到'9',且第一位不为'0' 
       {       
           for(i = __nLastCur;i > __curStrInput;i--) //插入录入字符
           {
               __strInput[i] = __strInput[i - 1];
           }
           __strInput[__curStrInput++] = __cInput; 
           __nLastCur++;
           for(i = __curStrInput - 1;i < __nLastCur;i++) //回显录入字符
           {
               printf("%c",__strInput[i]);
           }
           wherexy(&X,&Y); //末位光标位置获取 
           if(x != 79) //光标回位
           {
               gotoxy(x + 1,y);
           }
           else
           {
               gotoxy(0,y + 1);
           }
       }
       else if(__cInput == 13) //回车处理 
       {
           if(__nLastCur != 0)
           {          
               __strInput[__nLastCur] = 0;
               gotoxy(X,Y); //光标归尾 
               printf("\n");
               return 0;
           }
           else
           {
               printf("\n");
               return -1;
           }
       }
       else if(__cInput == 8 && __curStrInput != 0) //退格处理 
       {
           for(i = __curStrInput - 1;i < __nLastCur - 1;i++)
           {
               __strInput[i] = __strInput[i+1];
           }
           __strInput[i] = 0; 
           if(x != 0)
           {
               gotoxy(x - 1,y); //光标定位 
           }
           else
           {
               gotoxy(79,y - 1); //光标定位 
           }
           for(i = __curStrInput - 1;i < __nLastCur;i++)
           {
               printf("%c",__strInput[i]);
           }
           wherexy(&X,&Y); //末位光标位置获取
           if(x != 0)
           {
               gotoxy(x - 1,y);
           }
           else
           {
               gotoxy(79,y - 1);
           }
           __curStrInput--;
           __nLastCur--;
       }
       else if(__cInput == 75 && __curStrInput != 0) //左退光标 
       {
           wherexy(&x,&y); //获得光标位置 
           if(x != 0)
           {
               gotoxy(x - 1,y); //光标定位 
           }
           else
           {
               gotoxy(79,y - 1); //光标定位 
           }
           __curStrInput--;
       }
       else if(__cInput == 77 && __curStrInput < __nLastCur) //右进光标 
       {
           printf("%c",__strInput[__curStrInput]);
           __curStrInput++;
       }
       else if(__cInput == 27) //EXC退出 
       {
            return 1;
       }
       else if(__cInput == -32){} 
       else //其它非法字符 
       {
           printf("\a");
       }        
   }
}
void gotoxy(int x,int y)
{
    COORD coord; //windows.h中描述点的结构体 
    coord.X = x;
    coord.Y = y;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 
    SetConsoleCursorPosition(hOut,coord); //将光标定位在coord所描述的位置 
}

void wherexy(int *x,int *y)
{
    CONSOLE_SCREEN_BUFFER_INFO bInfo; //显存 
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 
    GetConsoleScreenBufferInfo(hOut,&bInfo);
    COORD coord = bInfo.dwCursorPosition; //将显存中光标信息赋予coord 
    *x = coord.X;
    *y = coord.Y;
}

#19


参考Notepad++的源代码

#20


see see

#21


18L你还真带劲,真去写的,这种日企去了只有一个结果,无限时的加班,可能工资会高点,但人生失去了意义
有的这样还不如去好点的国企,一样是加班,帮自己人干总比帮外人干好吧

#22


我想我完了,我学过c语言,可是我编不出来,看来要好好学学。

#23


mark

#24


#25


mark

#26


只是帮帮忙嘛,至于去不去是楼主的事,大家说对吧

#27


写不出来,向各位大虾学习中

#28


VIM

#29


Linux command "less" source code

#30


引用 2 楼 jennyvenus 的回复:
折腾人嘛,dos下的编程问题现在还拿出来。这程序上学学C的人才写,俺当年也写过。


珍妮维纳斯就是大头,史前动物了: )

想想windows记事本或者Vi编辑器,有几个人能做到?这个题目还真有难度。

#31


关注~

#32


找本<<c语言实用大全>>,上面有很多这方面的东西

#33


打倒日本鬼子!

#34


饿死,不进小日本厂

#35


变态,其实 我也曾经去过一家韩国公司笔试,出的题目比这个还变态
 
老外又变态心理!

#1


这是一个大工程,帮顶
google记事本的源码

#2


折腾人嘛,dos下的编程问题现在还拿出来。这程序上学学C的人才写,俺当年也写过。

#3


日本人真变态。

#4


无聊的xrb

#5


kankan,

#6


JF

#7


谁知道字符界面下光标怎么移动啊?

#8


纯c编译器用gotoxy就可以

若是用for windows的编译器(vc6.0或tc for windows)的话,可以用windows.h库文件的一个函数实现光标移动
是BOOL   SetConsoleCursorPosition(   
      HANDLE   hConsoleOutput,     //   handle   to   screen   buffer   
      COORD   dwCursorPosition     //   new   cursor   coordinates   
  );   
至于相应键盘觉得直接getchar读取字符就可以了吧?(如果要屏蔽其他按键的话就判断一下吧)
删除字符的话可以把光标移到指定位置printf("");应该可以实现吧!
光标在控制台上应该是自动换行的吧?没用过dos系统,不敢瞎说。

半角空格?是printf(" ")吗?(现在是半角输入法)
考虑shift键的话试一下同时读取两个字符?这个应该不像windows提供的api那么简单吧?
但是个人觉得控制台输入的话貌似已经考虑shift键了,不需要我们在作额外工作了吧?

个人的yy

#9


不会,帮顶!

#10


我建议不要加入这种公司,否则等你在哪混不下去想跳槽难。这么早的技术还搞啥搞

#11


真的是哟 靠他个日本鬼子

#12


参考SciTE源码

#13


不懂

#14


帮顶.等待解答.

#15


帮顶先!对了,LZ就这一道题吗?

#16


 我只有光标左移右移,退格删除的操作,当然了,固定屏幕大小可以换行。可左右移动。可以反函数代码发给你

#17


这样太bt了。

#18


int getInputStr(char *__strInput)
{
   char __cInput;
   int __curStrInput,__nLastCur;
   int x,y; //当前光标位置
   int X,Y; //末位光标位置 
   int i; //循环控制 
   __curStrInput = 0;
   __nLastCur = 0; //字符位数标志 
   while(1)
   {
       wherexy(&x,&y); //获得当前光标位置 
       __cInput = getch();
       if(__cInput > 47 && __cInput < 58 && __nLastCur < M && (__cInput != 48 || __curStrInput != 0))
       //长度允许范围内录入字符为'0'到'9',且第一位不为'0' 
       {       
           for(i = __nLastCur;i > __curStrInput;i--) //插入录入字符
           {
               __strInput[i] = __strInput[i - 1];
           }
           __strInput[__curStrInput++] = __cInput; 
           __nLastCur++;
           for(i = __curStrInput - 1;i < __nLastCur;i++) //回显录入字符
           {
               printf("%c",__strInput[i]);
           }
           wherexy(&X,&Y); //末位光标位置获取 
           if(x != 79) //光标回位
           {
               gotoxy(x + 1,y);
           }
           else
           {
               gotoxy(0,y + 1);
           }
       }
       else if(__cInput == 13) //回车处理 
       {
           if(__nLastCur != 0)
           {          
               __strInput[__nLastCur] = 0;
               gotoxy(X,Y); //光标归尾 
               printf("\n");
               return 0;
           }
           else
           {
               printf("\n");
               return -1;
           }
       }
       else if(__cInput == 8 && __curStrInput != 0) //退格处理 
       {
           for(i = __curStrInput - 1;i < __nLastCur - 1;i++)
           {
               __strInput[i] = __strInput[i+1];
           }
           __strInput[i] = 0; 
           if(x != 0)
           {
               gotoxy(x - 1,y); //光标定位 
           }
           else
           {
               gotoxy(79,y - 1); //光标定位 
           }
           for(i = __curStrInput - 1;i < __nLastCur;i++)
           {
               printf("%c",__strInput[i]);
           }
           wherexy(&X,&Y); //末位光标位置获取
           if(x != 0)
           {
               gotoxy(x - 1,y);
           }
           else
           {
               gotoxy(79,y - 1);
           }
           __curStrInput--;
           __nLastCur--;
       }
       else if(__cInput == 75 && __curStrInput != 0) //左退光标 
       {
           wherexy(&x,&y); //获得光标位置 
           if(x != 0)
           {
               gotoxy(x - 1,y); //光标定位 
           }
           else
           {
               gotoxy(79,y - 1); //光标定位 
           }
           __curStrInput--;
       }
       else if(__cInput == 77 && __curStrInput < __nLastCur) //右进光标 
       {
           printf("%c",__strInput[__curStrInput]);
           __curStrInput++;
       }
       else if(__cInput == 27) //EXC退出 
       {
            return 1;
       }
       else if(__cInput == -32){} 
       else //其它非法字符 
       {
           printf("\a");
       }        
   }
}
void gotoxy(int x,int y)
{
    COORD coord; //windows.h中描述点的结构体 
    coord.X = x;
    coord.Y = y;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 
    SetConsoleCursorPosition(hOut,coord); //将光标定位在coord所描述的位置 
}

void wherexy(int *x,int *y)
{
    CONSOLE_SCREEN_BUFFER_INFO bInfo; //显存 
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 
    GetConsoleScreenBufferInfo(hOut,&bInfo);
    COORD coord = bInfo.dwCursorPosition; //将显存中光标信息赋予coord 
    *x = coord.X;
    *y = coord.Y;
}

#19


参考Notepad++的源代码

#20


see see

#21


18L你还真带劲,真去写的,这种日企去了只有一个结果,无限时的加班,可能工资会高点,但人生失去了意义
有的这样还不如去好点的国企,一样是加班,帮自己人干总比帮外人干好吧

#22


我想我完了,我学过c语言,可是我编不出来,看来要好好学学。

#23


mark

#24


#25


mark

#26


只是帮帮忙嘛,至于去不去是楼主的事,大家说对吧

#27


写不出来,向各位大虾学习中

#28


VIM

#29


Linux command "less" source code

#30


引用 2 楼 jennyvenus 的回复:
折腾人嘛,dos下的编程问题现在还拿出来。这程序上学学C的人才写,俺当年也写过。


珍妮维纳斯就是大头,史前动物了: )

想想windows记事本或者Vi编辑器,有几个人能做到?这个题目还真有难度。

#31


关注~

#32


找本<<c语言实用大全>>,上面有很多这方面的东西

#33


打倒日本鬼子!

#34


饿死,不进小日本厂

#35


变态,其实 我也曾经去过一家韩国公司笔试,出的题目比这个还变态
 
老外又变态心理!