c语言,用printf输出字符数组到屏幕时,怎么把字符数组中的转义字符也给输出出来?

用例子说明把

char test[]={"1234\r\nabcd\t5678"}

使用printf打印,即printf("--- %s ---",test);

显示在屏幕上的输出表现:

--- 1234
abcd 5678 ---

但我想要的输出在屏幕上的表现,则是:

--- 1234\r\nabcd\t5678 ----

c语言里有没有直接便捷的方法做到?如果自己做的话,需要注意什么?

阅读 2.4k
3 个回答

转义,即把 \r \n \t 替换为 \\r \\n \\t,循环判断每个字符进行转义,这里给三种写法

方法一:一边转义一边输出

#include <stdio.h>

void printEscSp(const char *s) {
  const char *r = "tnvfr";
  for (; *s; ++s) {
    int i = *s - '\t';
    if (i >= 0 && i < 5) {
      putchar('\\');
      putchar(r[i]);
    } else {
      putchar(*s);
    }
  }
}

void main() {
  char s[] = "1234\r\nabcd\t5678";

  printf("--- ");
  printEscSp(s);
  printf(" ---\n");
  // --- 1234\r\nabcd\t5678 ---
}

方法二:把结果暂存到缓冲区,再输出,需确保缓冲区足够大

#include <stdio.h>

char *escSp1(char *t, const char *s) {
  char *first = t;
  const char *r = "tnvfr";
  for (; *s; ++s, ++t) {
    int i = *s - '\t';
    if (i >= 0 && i < 5) {
      *t = '\\';
      *++t = r[i];
    } else {
      *t = *s;
    }
  }
  *t = 0;
  return first;
}

void main() {
  char s[] = "1234\r\nabcd\t5678", buf[sizeof(s) * 2];

  printf("--- %s ---\n", escSp1(buf, s));
  // --- 1234\r\nabcd\t5678 ---
}

方法三:动态申请内存保存结果,再输出,最后释放内存

#include <stdio.h>
#include <stdlib.h>

char *escSp2(const char *s) {
  int newSize = 1;
  for (char *p = s; *p; ++p)
    newSize += 1 + (*p >= '\t' && *p <= '\r');
  char *first = malloc(newSize), *t = first;
  const char *r = "tnvfr";
  for (; *s; ++s, ++t) {
    int i = *s - '\t';
    if (i >= 0 && i < 5) {
      *t = '\\';
      *++t = r[i];
    } else {
      *t = *s;
    }
  }
  *t = 0;
  return first;
}

void main() {
  char s[] = "1234\r\nabcd\t5678", *p;

  printf("--- %s ---\n", p = escSp2(s));
  // --- 1234\r\nabcd\t5678 ---
  free(p);
}
新手上路,请多包涵

将代码改为

char test[]={"1234\\r\\nabcd\\t5678"}

即可

新手上路,请多包涵

大概意思就是给转义字符转义

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进