| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8246 人关注过本帖
标题:在别的论坛看见的问题,求解答!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面是回避API的方法,響應稍慢:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

const int K_ENTER     = 0x0d;
const int K_BACKSPACE = 0x08;
const int K_SPACE     = 0x20;

int myGets(char* str, int maxLength);

int main(void)
{
    char str[11];

    myGets(str, sizeof(str) - 1);
    puts(str);

    printf_s("\nPress any key to continue...");
    _getch();
    return EXIT_SUCCESS;
}

int myGets(char* str, int maxLength)
{
    const char cursor = '%';
    int ch;
    int index = 0;

    do
    {
        _putch(cursor);
        _putch(K_BACKSPACE);
        ch = _getch();
        switch (ch)
        {
            case K_BACKSPACE:
                if (index > 0)
                {
                    _putch(ch);
                    _putch(K_SPACE);
                    _putch(K_SPACE);
                    _putch(K_BACKSPACE);
                    _putch(K_BACKSPACE);
                    --index;
                }
                break;
            case K_ENTER:
                break;
            default:
                _putch(ch);
                str[index++] = ch;
                break;
        }
    } while ((ch != K_ENTER) && (index < maxLength));
    str[index] = '\0';

    _putch('\n');

    return index;
}




[ 本帖最后由 TonyDeng 于 2015-3-3 01:51 编辑 ]

授人以渔,不授人以鱼。
2015-03-02 23:56
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
输入的过程中%一直在你输入的字符串的末尾~


我最初没有看懂
现在看来
你是要求不断重写stdout
就是说
要把已经输出到屏幕上的字符删除掉
再在已经删除掉位置上重新输出新的字符
这个对于我而言
太难……

Only the Code Tells the Truth             K.I.S.S
2015-03-02 23:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果用Win32 API,響應會更快,但代碼量也比這個多(許多)。用Win32 API也可以做得更好,隱藏原來的下劃綫光標,直接用%當光標了,而現在會被看出破綻。

授人以渔,不授人以鱼。
2015-03-03 00:03
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
下面代码用api了
#include<stdio.h>
#include<conio.h>
#include<windows.h>
void gotoxy(int x,int y)//设置字符显示位置
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}

void scanstr(char *p)
{//模拟输入时显示带“%”的字符串;以此类推可扩展模拟scanf多参数输入功能
    char a;
    int j=0,y;
    HANDLE     gh_std_out;
    gh_std_out = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO    bInfo;
    GetConsoleScreenBufferInfo(gh_std_out,&bInfo);
    y=(int)bInfo.dwCursorPosition.Y;
    while(1)
    {
        if(kbhit())   //判断击键
        {
            a=getch();
            if(a>=0&&a<128)
            {
                if(a==13)break;
                if(a==8)
                {
                    if(j>0)j--;
                    p[j]=0;
                }
                else
                {
                    p[j]=a;
                    j++;
                    p[j]=0;
                }
                gotoxy(0,y);
                printf("%s%c",p,37);
                printf("%2s"," ");
                gotoxy(j,y);
            }
            else
                a=getch();
        }
    }
    printf("\n");
}
void main()
{
    char a[50];
    printf("请输入:\n");
    scanstr(a);
}

能编个毛线衣吗?
2015-03-03 00:35
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 11楼 TonyDeng
原来显示08可直接回退光标,这样可以省好多代码的,害的我要显示字符串,获取光标y值。还是T版主免api的代码简洁。
T版主代码未做光标移动键处理,我代码未做数组越界处理。

[ 本帖最后由 wmf2014 于 2015-3-3 00:49 编辑 ]

能编个毛线衣吗?
2015-03-03 00:47
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
借鉴T版主的方法,屋api的代码少多了。
程序代码:
#include<stdio.h>
#include<conio.h>
void scanstr(char *p)
{//模拟输入时显示带“%”的字符串;以此类推可扩展模拟scanf多参数输入功能
    char a;
    int j=0;
    p[j]=0;
    while(1)
    {
        if(kbhit())   //判断击键
        {
            a=getch();
            if(a>=0&&a<128)
            {
                if(a==13)break;
                putch(8);
                putch(a);
                putch(37);
                putch(32);
                putch(8);
                if(a==8)
                {
                    if(j>0)j--;
                    p[j]=0;
                }
                else
                {
                    p[j]=a;
                    j++;
                    p[j]=0;
                }
            }
            else
                a=getch();
        }
    }
    printf("\n");
}
void main()
{
    char a[50];
    printf("请输入:\n");
    scanstr(a);
    printf("%s\n",a);
}




[ 本帖最后由 wmf2014 于 2015-3-3 01:08 编辑 ]

能编个毛线衣吗?
2015-03-03 01:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wmf2014在2015-3-3 00:47:45的发言:

原来显示08可直接回退光标,这样可以省好多代码的,害的我要显示字符串,获取光标y值。还是T版主免api的代码简洁,

BACKSPACE控制符的作用就是回退一格,不刪除東西的,刪除是輸入函數的附加動作。在打印機上重叠打印圖案,會用到這個控制符,也是定義這個控制符的本意。

光標挪來挪去,怎麽都是慢的,最快的方法是直接對顯示緩存賦値,亦即所謂的直接寫屏技術。以前tc/bc的顯示速度那麽快,用的就是這個,它要獲取顯卡文本模式的内存入口,故兼容性差,在圖形下或用圖形態仿真文本的中文外挂系統中,都需要截獲這種寫屏操作把真實的數據改到圖形内存中處理,那是隨著顯卡及其驅動的不同而變化的,那幾乎要程序員摸熟市面上大多數的顯卡資料才成(這也是tc/bc頂多支持到EGA/VGA模式的原因,移植到Windows上才借用Windows的GDI接口支持各種圖形模式)。Windows由於强制統一了各種驅動的規範,才結束了DOS時代群雄割據的局面,我們寫程序才方便了許多,現在基本不考慮底層地址了,衹要調用接口就成,這也是不需要再像以前那樣對底層很熟悉的原因(實際上也不可能對市面上那麽多硬件細節都瞭解,嵌入式是針對獨特設備的,不是面向普遍的,將來入了哪個廠就專攻該廠產品,不用在這個時候鑽研,很多人還在學以前的匯編,面對獨特硬件,很沒必要)。


[ 本帖最后由 TonyDeng 于 2015-3-3 01:15 编辑 ]

授人以渔,不授人以鱼。
2015-03-03 01:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
爲了方便樓主初學者的理解,我這裏衹處理了退格。其實要處理的還有許多,比如用戶按了控制鍵(比如光標移動鍵),那個顯示就有怪字符。所以我說實際的代碼會多許多,而不是那麽一點點。現在這個還衹是處理單字節字符,還有處理中文的,那可不是一格一格的問題。中英混雜的處理,我以前也發過代碼的。

授人以渔,不授人以鱼。
2015-03-03 01:11
大爱CATs
Rank: 4
来 自:重庆
等 级:业余侠客
威 望:3
帖 子:108
专家分:250
注 册:2015-1-13
收藏
得分:0 
回复 10楼 TonyDeng
多谢指点,我明白了!
我再试试吧

弹指一挥间
2015-03-03 09:45
大爱CATs
Rank: 4
来 自:重庆
等 级:业余侠客
威 望:3
帖 子:108
专家分:250
注 册:2015-1-13
收藏
得分:0 
回复 18楼 TonyDeng
感觉这些对我现在来说还有点复杂,我还要慢慢消化。

弹指一挥间
2015-03-03 09:50
快速回复:在别的论坛看见的问题,求解答!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.136828 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved