This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to let gets() work correctly?

IN C Starndard lib, use gets can input string form stdio.

for example, push [backspace] can remove the last char.

But when i use gets(), it keep backspace char (0x0B).

Parents
  • I just refenece VC++ document.
    So you right.

    I should write a func to handle it, like this.
    char *getstring(char *string)
    { char *pointer; INT ch;

    pointer = string; while (1) { ch = _getchar_lk(); if (ch == EOF) { return NULL; }

    if (ch == 8) { if (pointer > string) { putchar('\b'); putchar(' '); putchar('\b'); pointer--; } } else if (ch == '\r' || ch =='\n' || ch >= ' ') { putchar(ch); if (ch == '\r') putchar('\n'); if (ch == '\n' || ch == '\r') break; *pointer++ = ch; } }

    *pointer = 0; return string;
    }

Reply
  • I just refenece VC++ document.
    So you right.

    I should write a func to handle it, like this.
    char *getstring(char *string)
    { char *pointer; INT ch;

    pointer = string; while (1) { ch = _getchar_lk(); if (ch == EOF) { return NULL; }

    if (ch == 8) { if (pointer > string) { putchar('\b'); putchar(' '); putchar('\b'); pointer--; } } else if (ch == '\r' || ch =='\n' || ch >= ' ') { putchar(ch); if (ch == '\r') putchar('\n'); if (ch == '\n' || ch == '\r') break; *pointer++ = ch; } }

    *pointer = 0; return string;
    }

Children
  • Any reason why you missed the instruction how to post source code? Notice any difference in readability?

    char *getstring(char *string) {
        char *pointer;
        INT ch;
    
        pointer = string;
        while (1) {
            ch = _getchar_lk();
            if (ch == EOF) {
                return NULL;
            }
    
            if (ch == 8) {
                if (pointer > string) {
                    putchar('\b');
                    putchar(' ');
                    putchar('\b');
                    pointer--;
                }
            } else if (ch == '\r' || ch =='\n' || ch >= ' ') {
                putchar(ch);
                if (ch == '\r') putchar('\n');
                if (ch == '\n' || ch == '\r') break;
                *pointer++ = ch;
            }
        }
    
        *pointer = 0;
        return string;
    }
    


    By the way - what happens if you have already received characters that you have stored in your string when you get an EOF?

    Another thing - exactly how large is your string? What happens if someone enters moer characters than what will fit in string?

  • Remember that VC++ documentation will deal with the specific VC++ implementation; you should not assume that what it says is generally applicable to all implementations - especially embedded cross-compiler implementations!

  • I don't think the VC++ documentation claims such behaviour either, since such behaviour is not part of the C standard and platform-specific behaviour should only be introduced when the platform so needs.

    I can't find anything in my VC++ documentation.

    But as I did mention - when the sending side handles the data line-by-line instead of character-by-character, it can process the backspace character so you may see this behaviour in a test program even if it isn't gets()/fgets() that is doing the backspace processing.