2012-01-11 76 views
2

我们知道一些转义序列'\ n' - 新行,但是说我们不知道\ a,\ b,\ c .... \ z是否是转义序列。如何编写一个程序,它允许我们在printf语句中测试从a到z和/或A到Z的每个字符,或者用其他方式来标识转义序列,如果是,则打印它的值,例如输出中可能看起来像这样:如何编写一个程序来识别C中的转义序列并打印它们的值?

“\ B”是一个特殊字符和“\ b”值= 8

此程序可能都看傻了,但我不能够找到一个解决方案,这... 在此先感谢。

+0

虽然它击败了编写程序的目的,但您可以对所有这些转义序列的谷歌... – Mysticial 2012-01-11 21:38:41

+0

这是HW吗?为什么你需要全部打印出来?他们在这里列出:http://msdn.microsoft.com/en-us/library/h21280bw(v=VS.100).aspx – mpen 2012-01-11 21:41:34

+0

你需要这个程序是在任何特定的语言?如果没有,你可以编写一个shell脚本,反复编译并运行一个C程序,为每个字符x打印\ x并查看它输出的内容。 – HighCommander4 2012-01-11 21:43:06

回答

2

正如Carl Norum指出的那样,这些是由编译器解释的。可以采取类似的autoconf(其产生configure脚本程序)的方法:

#!/bin/bash 

for LETTER in {a..z} 
do 
    cat > letter.c <<EOF 
#include <stdio.h> 
int main() { printf("\\\\$LETTER has ASCII value %u\n", "\\$LETTER"[0]); } 
EOF 
    cc -Werror -o letter letter.c > /dev/null 2>&1 && ./letter 
done 

输出:

\a has ASCII value 7 
\b has ASCII value 8 
\e has ASCII value 27 
\f has ASCII value 12 
\n has ASCII value 10 
\r has ASCII value 13 
\t has ASCII value 9 
\v has ASCII value 11 

注:其原因字符串常量,而不是一个字符常数只是外壳引用。这依赖于gcc-Werror,但您可以通过其他方式解决该问题。

4

阅读标准C99文档中的5.2.2p2。

字母转义序列是:

\a \b \f \n \r \t \v 
+0

+1。现在我重新阅读OP的问题,我想你可能会更加正确地回答手头的实际问题。 – 2012-01-11 21:44:38

1

我想你可能会感到困惑发生了什么。 编译器正在解释那些转义序列,而不是任何运行时行为。您的程序不能做你在问什么,因为\n\b或任何你想要的存在在你的程序在运行时的格式。例如,字符串中包含的是实际的ASCII值,而不是您在源代码中必须使用的转义序列,因为无法输入文字铃声字符。

0

这确实听起来像一个家庭作业,所以我给你一些强烈的暗示:

  1. 看看isprint判断()函数来告诉什么可打印

  2. 看任何方便字符图表来查看各种特殊字符如何用数字表示。

  3. 要打印该值,只需在printf中使用十进制(d)格式。

+1

换行符或制表符(例如)是可打印字符,也是'printf'转义序列。 – 2012-01-11 21:45:32

+0

...我也可以写出所有的代码@CarlNorum。 – 2012-01-13 04:16:36

相关问题