我们知道一些转义序列'\ n' - 新行,但是说我们不知道\ a,\ b,\ c .... \ z是否是转义序列。如何编写一个程序,它允许我们在printf语句中测试从a到z和/或A到Z的每个字符,或者用其他方式来标识转义序列,如果是,则打印它的值,例如输出中可能看起来像这样:如何编写一个程序来识别C中的转义序列并打印它们的值?
“\ B”是一个特殊字符和“\ b”值= 8
此程序可能都看傻了,但我不能够找到一个解决方案,这... 在此先感谢。
我们知道一些转义序列'\ n' - 新行,但是说我们不知道\ a,\ b,\ c .... \ z是否是转义序列。如何编写一个程序,它允许我们在printf语句中测试从a到z和/或A到Z的每个字符,或者用其他方式来标识转义序列,如果是,则打印它的值,例如输出中可能看起来像这样:如何编写一个程序来识别C中的转义序列并打印它们的值?
“\ B”是一个特殊字符和“\ b”值= 8
此程序可能都看傻了,但我不能够找到一个解决方案,这... 在此先感谢。
正如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
,但您可以通过其他方式解决该问题。
阅读标准C99文档中的5.2.2p2。
字母转义序列是:
\a \b \f \n \r \t \v
+1。现在我重新阅读OP的问题,我想你可能会更加正确地回答手头的实际问题。 – 2012-01-11 21:44:38
我想你可能会感到困惑发生了什么。 编译器正在解释那些转义序列,而不是任何运行时行为。您的程序不能做你在问什么,因为\n
或\b
或任何你想要的存在在你的程序在运行时的格式。例如,字符串中包含的是实际的ASCII值,而不是您在源代码中必须使用的转义序列,因为无法输入文字铃声字符。
这确实听起来像一个家庭作业,所以我给你一些强烈的暗示:
看看isprint判断()函数来告诉什么可打印
看任何方便字符图表来查看各种特殊字符如何用数字表示。
要打印该值,只需在printf中使用十进制(d
)格式。
换行符或制表符(例如)是可打印字符,也是'printf'转义序列。 – 2012-01-11 21:45:32
...我也可以写出所有的代码@CarlNorum。 – 2012-01-13 04:16:36
虽然它击败了编写程序的目的,但您可以对所有这些转义序列的谷歌... – Mysticial 2012-01-11 21:38:41
这是HW吗?为什么你需要全部打印出来?他们在这里列出:http://msdn.microsoft.com/en-us/library/h21280bw(v=VS.100).aspx – mpen 2012-01-11 21:41:34
你需要这个程序是在任何特定的语言?如果没有,你可以编写一个shell脚本,反复编译并运行一个C程序,为每个字符x打印\ x并查看它输出的内容。 – HighCommander4 2012-01-11 21:43:06