【问题标题】:How to print ASCII value of 2 characters?如何打印 2 个字符的 ASCII 值?
【发布时间】:2017-08-12 12:56:08
【问题描述】:

我正在尝试打印“\t”的 ASCII 值,即转义序列。 但我的程序只打印“\”的 ASCII 值,即 ASCII 值将是 92。 有没有办法打印 2 个字符的 ASCII 值? 非常感谢您的帮助。我在下面包含了我的代码。

#include<stdio.h>

main()

{

    char b=0;

    printf("Enter any character to print it's ASCII value : ");

scanf("%c",&b);

printf("The ASCII value of '%c' is %d",b,b);

return 0;

}

【问题讨论】:

  • '\t' 是一个字符。它是一个制表符。当你把它写成字符串文字时,你用两个字符来表达它。但是当你接受输入时,它会把它当作一个反斜杠和一个 t,比如'\\t'
  • 您会发现,如果您按下键盘上的TAB 键而不是输入\t,您会得到预期的结果,即9。那是因为\t 只是一个表示水平制表符的方式。 (This might be a good read 帮助了解发生了什么。)
  • 那么如何打印“\t”两个字符的ASCII值呢?我必须显示 "\t" 的 ASCII 值,这可能吗?
  • 我不确定您的要求是否完全清楚。如果您在程序中输入反斜杠后跟 t,您能否举例说明您希望输出是什么?
  • 这就是我想通过上述程序输入 \t 或 \n 或 \a 等字符以查找其值时发生的情况。

标签: c ascii codeblocks


【解决方案1】:

捕获反斜杠的输入并将其作为单独的输入处理。可以使用开关打印转义字符的结果。

#include <stdio.h>

int main( void) {
    char b=0;

    printf("Enter any character to print it's ASCII value : ");

    if ( 1 == scanf(" %c",&b)) {
        if ( b == '\\') {//read a backslash
            if ( 1 == scanf(" %c",&b)) {
                switch ( b) {
                    case 't' :
                        printf("The ASCII value of '\\t' is %d\n", '\t');
                        break;
                    case '\\' :
                        printf("The ASCII value of '\\' is %d\n", '\\');
                        break;
                    default :
                        printf ( "not handled yet\n");
                }
            }
        }
        else {
            printf("The ASCII value of '%c' is %d\n",b,b);
        }
    }

    return 0;
}

输出

输入任何字符以打印其 ASCII 值:\t
'\t' 的 ASCII 值为 9

输入任何字符以打印其 ASCII 值:\\
'\' 的 ASCII 值为 92

要获取反斜杠的代码,必须输入两个反斜杠

【讨论】:

  • 非常感谢xing。这正是我想要的。但是,如果您能帮助解释“1 == scanf(" %c",&b)”和“( b == '\\')”会很有帮助。
  • 但是当我写 2 而不是 1 时,第二个 printf 语句没有打印出来,与 3 一样。你能解释一下吗?
  • 当我写 "if ( 2 == scanf(" %c",&b))" 语句 "printf("'%c' 的 ASCII 值是 %d\n",b ,b);"不在输出中打印。这就是我要说的。
  • 好的,现在我明白了问题所在。非常感谢 xing 的帮助。
  • printf("The ASCII value of '\\t' is %d\n", '\t'); 仅在源编码为 ASCII 的情况下打印'\t' 的 ASCII 值(非常常见)。要打印'\t' 的ASCII 值,请使用printf("The ASCII value of '\\t' is %d\n", 9);
【解决方案2】:

此代码可能会帮助您了解这里发生了什么:

#include <stdio.h>

const char* escaped(int ch) {
    switch (ch) {
    case '\t': return "tab";
    case '\n': return "newline";
    case '\r': return "carriage return";
        // continue with other escaped characters
    default: return "not escaped";
    }
}

int main()
{
    char b = 0;
    printf("Enter any character to print it's ASCII value : ");
    scanf("%c", &b);
    printf("The ASCII value of '%c' is %d and is also known as: %s\n", b, b, escaped(b));
}

要明确一点,对于一个选项卡,您只需在键盘上按 Tab 键即可。您不输入字符串“\t”。字符串 "\t" 将被解释为 2 个字符:'\' 和 't'。

\ 转义码是您在 C 代码中编写字符串时使用的代码。 例如,如果您在某些 C 源代码中键入字符串“trying”,那么您正在输入字符流:t r y i n g,但如果您键入字符串:“\trying”,那么第一个字符表示这是一个转义字符并且是一种方便的方式来表明您确实想要一个制表符,后跟字符:r y i n g。

使用上面的代码,如果你输入“\t”,scanf 只是从标准输入获取,一次一个字符,所以它只取第一个字符,反斜杠(转义序列的开始),并打印出来:

Enter any character to print it's ASCII value : \t
The ASCII value of '\' is 92 and is also known as: not escaped

“t”字符仍在输入流中,程序尚未处理此字符。

scanf 不会将“\t”解释为制表符,而是将其解释为字符流 \ 后跟 t。这让你感到困惑。

您在运行此代码时会遇到一些问题。例如,您想尝试退格,即 \b 或十进制 8 值。 scanf 可能会忽略它并假设您正在尝试退格前一个字符。但是对于其他转义字符,例如制表符和换行符,它会起作用。

阅读:https://en.wikipedia.org/wiki/Escape_character

【讨论】:

    【解决方案3】:
     #define INV       (EOF -1)
    
    int z = 0, tmp = INV;
    char buff[6] = "\\0";
    while (1)
    {
        if (tmp == INV)
            z = getchar();
        else
        {
            z = tmp;
            tmp = INV;
        }
        if (z == EOF || tmp == EOF) break;
        if (z == '\\')
        {
            tmp = getchar();
            switch (tmp)
            {
            case 't':
                z = '\t';
                tmp = INV;
                break;
            case 'b':
                z = '\b';
                tmp = INV;
                break;
            case 'r':
                z = '\r';
                tmp = INV;
                break;
            case 'n':
                z = '\n';
                tmp = INV;
                break;
    
                // add here anothere ones
            default:
                break;
            }
        }
        printf("Char \\0%03o - '%c'\t\t has the ascii code of %03d decimal 0x%02X hexadecimal\n",  z, z < 32 ? ' ' : z, z, z);
    }
    

    【讨论】:

    • 非常感谢 PeterJ 的回答。但我是 C 编程新手,所以我很难理解这个程序。
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 2016-12-25
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2010-12-14
    相关资源
    最近更新 更多