如果代碼需要與寫沒有歧義,用C語法:
#include <ctype.h>
#include <string.h>
#include <stdio.h>
void EscapePrint(int ch) {
// Delete or adjust these 2 arrays per code's goals
// All simple-escape-sequence C11 6.4.4.4
static const char *escapev = "\a\b\t\n\v\f\r\"\'\?\\";
static const char *escapec = "abtnvfr\"\'\?\\";
char *p = strchr(escapev, ch);
if (p && *p) {
printf("\\%c", escapec[p - escapev]);
} else if (isprint(ch)) {
fputc(ch, stdout);
} else {
// Use octal as hex is problematic reading back
printf("\\%03o", ch);
}
}
void EscapePrints(const char *data, int length) {
while (length-- > 0) {
EscapePrint((unsigned char) *data++);
}
}
可替換地,代碼可以
void EscapePrint(char sch) {
int ch = (unsigned char) sch;
...
}
void EscapePrints(const char *data, int length) {
while (length-- > 0) {
EscapePrint(*data++);
}
}
要使用十六進制轉義序列或縮短八進制轉義序列,代碼需要確保該下一個字符不會產生歧義。在上面的代碼中不會出現這種複雜情況,因爲它使用3位八進制轉義序列。修正後的代碼會是這樣的:
} else {
if ((ch == 0) && (nextch < '0' || nextch > '7')) {
fputs("\\0", stdout);
}
else if (!isxdigit((unsigned char) nextch)) {
printf("\\x%X", ch);
}
else {
// Use octal as hex is problematic reading back
printf("\\%03o", ch);
}
}
是否直接打印字符不只是工作?你只需要轉義char字面...我不明白爲什麼你需要使用。 – Dennis
當前''\\ 0''是兩個字符:char''\\''和char''0''。這實際上是否將'\ 0'打印到'c == 0'的終端上? – turbulencetoo
'\\ 0'是一個值爲23600(0x5C30)或12380(0x305C)的整數,不管字節順序如何。因此,%c將會打印\或0.機器的字節順序與編譯器的選擇無關。 –