3

我正在尝试用文字打印 01-99,但我有点成功。

这是源代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char a, b;
    char *digit1;
    char *digit2;

    // get digit character by character
    scanf("%c%c", &a, &b);

    switch(a) {
        case '1':
            switch(b) {
                case '0':
                    digit1 = "ten";
                    break;

                case '1':
                    digit1 = "eleven";
                    break;

                case '2':
                    digit1 = "twelve";
                    break;

                case '3':
                    digit1 = "thirteen";
                    break;

                case '4':
                    digit1 = "fourteen";
                    break;

                case '5':
                    digit1 = "fifteen";
                    break;

                case '6':
                    digit1 = "sixteen";
                    break;

                case '7':
                    digit1 = "seventeen";
                    break;

                case '8':
                    digit1 = "eighteen";
                    break;

                case '9':
                    digit1 = "nineteen";
                    break;

                default:
                    digit1 = "";
                    break;
            }
            break;

        case '2':
            digit1 = "twenty-";
            break;

        case '3':
            digit1 = "thirty-";
            break;

        case '4':
            digit1 = "forty-";
            break;

        case '5':
            digit1 = "fifty-";
            break;

        case '6':
            digit1 = "sixty-";
            break;

        case '7':
            digit1 = "seventy-";
            break;

        case '8':
            digit1 = "eighty-";
            break;

        case '9':
            digit1 = "ninty-";
            break;

        default:
            digit1 = "";
    }

    switch(b) {
        case '1':
            digit2 = "one";
            break;

        case '2':
            digit2 = "two";
            break;

        case '3':
            digit2 = "three";
            break;

        case '4':
            digit2 = "four";
            break;

        case '5':
            digit2 = "five";
            break;

        case '6':
            digit2 = "six";
            break;

        case '7':
            digit2 = "seven";
            break;

        case '8':
            digit2 = "eight";
            break;

        case '9':
            digit2 = "nine";
            break;

        case '0':
            digit2 = "\b";
            break;

        default:
            digit2 = strcpy(digit1, "\b");
    }

    if (a != 1) {
        printf("%s%s\n", digit1, digit2);
    }
    else {
        printf("%s\n", digit1);
    }

    return 0;
}

我从 20-99 年到现在都成功打印了。但是有一个错误。如果我输入 20、30、40... 中的任何一个,-则不会被删除,因为它应该是因为我曾经\b删除过它。

4

3 回答 3

4

你可以更换

digit2 = "\b";

经过

if (digit1[0] != '\0')
    digit1[strlen(digit1) - 1] = '\0';

这有效地从digit1.

由于这完全适用于您的字符串级别,因此您可以避免依赖设备特定的行为\b

于 2013-10-02T01:53:50.983 回答
2

这有点超出 C 标准,因为它涉及输入/输出环境的行为,但通常退格字符只是重新定位光标。要备份和擦除,请尝试顺序 BACKSPACE SPACE BACKSPACE。

这是 DEC VT100 终端的行为,它非常普遍(也称为 ANSI 终端,XTERM 衍生终端也使用相同的终端)。正如@jxh 指出的那样,仅当输出设备是终端时才适合添加终端特定的序列。如果您正在写入文件,这不会擦除,而只是将这些额外的字节添加到输出流中。但是,如果稍后将这些延迟序列写入终端(可能使用cat. 您可以使用 POSIX 函数isatty(3)来很好地猜测这些序列是否会被解释。

可以通过调整文件位置来取消写入缓冲写入中的字符。

FILE *myfile = /*initialization*/;
/* ... */
fsetpos (myfile, -1, SEEK_CUR);

还请考虑 MvG 的宝贵意见,以了解这些方法可能会失败的更多方式。(这确实是一个不稳定的领域,超出了标准。brrrrr。:)

于 2013-10-02T01:39:19.690 回答
1

转义码“\b”发出一个终端控制字符;也就是说,它向输出流写入一个额外的控制字符,它不会从输出流中删除以前的字符:在大多数系统上,“hellO\bo”产生一个 8 字节的字符串文字,相当于{ 'h', 'e', 'l', 'l', 'O', '\b', 'o', '\0' };

但是,重要的是要记住这是一个终端控制字符。它的作用取决于终端:一些终端将光标向左移动,停在第 0 列,一些终端将光标向左移动并换行,一些终端擦除光标到达的字符,另一些则没有。

但更重要的是,如果您不是通过终端查看数据,它只是一个字节。例如代码

#include <stdio.h>
int main(int argc, char* argv[]) {
    printf("Hello!\b\n");
}

将生成一系列 ascii 值,如果使用 linux "cat" 查看可能会显示 "Hello",使用 Windows/DOS "more" 命令 "Hello!" (DOS 是一个非破坏性的退格键)如果在记事本中加载会产生“Hello!” 其次是看起来像翼丁的东西。

不要将终端控制与 io-stream 控制混淆。

于 2013-10-02T02:36:46.643 回答