[완료]패스워드 함수를 만들고 있습니다. *표시를 해주는^^

anaud2의 이미지

안녕하세요

화면에서 패스워드를 입력하게 되면 * 표시가 나오는 함수를 만들고 있는데요 완성이 된다면 오픈소스를 올리는곳에 올리고 싶어서 계속 만들고 있습니다.ㅎ;
한가지 막히는점이 있어서 질문을 드리려고 글을 올립니다.

#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
static struct termios stored_settings;
 
void echo_off(void)
{
    struct termios new_settings;
    tcgetattr(0, &stored_settings);
    new_settings = stored_settings;
    new_settings.c_lflag &= (~ECHO);
    new_settings.c_lflag &= (~ICANON);
    tcsetattr(0, TCSANOW, &new_settings);
 
    return;
}
 
void echo_on(void)
{
    tcsetattr(0, TCSANOW, &stored_settings);
    return;
}
 
void get_pass(char *pass)
{
    char buf;
    int i=0;
 
    printf("Passwd:");
    echo_off();
    while( (buf = getc(stdin)) != 10 )
    {
        if(buf != 8)
        {
            pass[i]=buf;
            putc(42,stdout);
            i++;
        }
        else
        {
            pass[i-1] = 0;
            putc(8,stdout);
            i--;
        }
    }
    echo_on();
}
 
int main()
{
    char pass[16];
    memset(pass, 0x00, 16);
    get_pass(pass);
    printf("\n Your input : [%s] len[%d]\n",pass, strlen(pass));
    return 1;
}

위의 소스에서 화면에 패스워드를 입력을 할때마다 *표시가 나타나고 그값은 다른곳에 안전하게 저장이 됩니다. 백스페이스를 입력을 해도 문자열에서는 그값이 지워지며 정확한 값을 출력시킬수 있습니다.
문제는 화면에서 백스페이스를 입력을 하면 *도 지워져야 하지만 이미 출력시킨 *을 지울수가 없네요 백스페이스값을 putc로 출력해봤지만
화면이 옆으로 이동은 가능하나...이미 나타난 값은 지워지지가 않습니다.

화면에 이미 나타난 값은 어떻게 지울까요? 이부분은 고차원적인 문제인거 같습니다. 생각을 떠올려보는데 잘안되네요 조언 부탁드립니다.

ps. 글을 올리고 혼자 고민하다 방법을 찾았습니다. 방법은 스페이스를 채워주는것 입니다. 스페이스는 [ ]표시이기에 스페이스를 채우고 또 다시 벡스패이스로
커서를 옮겨 놓기에 다음 문자열이 입력이 되면 *표시를 해줄수 있는것이죠
잔머리로 만든 부분이지만 써볼만하기에 괜찮은것 같습니다.^^

IsExist의 이미지

stream 함수 대신에 저수준 함수를 사용해 보세요. read, write 말입니다.
한자 한자 입력 처리 하기에는 getc, putc 와 같은 스트림 함수 보다는
read, write 같은 low level 함수가 적당합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.