控制台输出带有特殊字符的字符串

时间:2017-10-13 10:14:54

标签: c++ c formatted

是否有一种或多或少的标准方法来输出包含特殊字符的字符串,例如ASCII控制代码,使得输出是一个有效的C / C ++文字字符串,带有转义序列?

预期输出示例:This\nis\na\\test\n\nShe said, \"How are you?\"\n

无需关注,输出将是

This
is
a\test

She said, "How are you?"

不是什么想要的。

3 个答案:

答案 0 :(得分:1)

打印转义字符串显然很棘手。

问题包括

  1. 控制字符和空字符
  2. 逃离逃脱角色。
  3. 否定char
  4. 十六进制转义序列的长度没有指定限制。八位数限制为3位数。

    void EscapePrint(char ch) {
      // 1st handle all simple-escape-sequence C11 6.4.4.4
      // The important one to detect is the escape character `\`
      // Delete or adjust these 2 arrays per code's goals
      static const char *escapev = "\a\b\t\n\v\f\r\"\'\?\\";
      static const char *escapec = "abtnvfr\"\'\?\\";
      char *p = strchr(escapev, (unsigned char) ch);
      if (p && *p) {
        printf("\\%c", escapec[p - escapev]);
      }
    
      // if printable, just print it.
      else if (isprint((unsigned char) ch)) {
        fputc(ch, stdout);
      }
    
      // else use octal escape  
      else {
        // Use octal as hex is problematic reading back
        printf("\\%03hho", ch);
      }
    }
    
  5. 迂腐:在char范围超过9位的稀有机器上,八进制转义序列是一个问题。这可以使用字符串级别的十六进制转义序列处理,而不是char char基础处理,因为十六进制转义序列需要限制。例如:

      input 2 `char`:            \1 A
      //                               v----- intervening space
      output text including ":   "\\x1" "A"
    

答案 1 :(得分:0)

根据您可能尝试实现的目标,我可以建议以下解决方案:只需用" \ xnn"替换任何不可打印的字符。 (nn是角色的ascii代码。这将归结为

void myprint (char *s) {
   while (*s) {
      printf(isalnum((unsigned char) *s) ? "%c" : "\\%03hho", *s);
      s++;
   }
}

这当然不会使用\n之类的特殊缩写(但\x0a),但这不应该是一个问题。

答案 2 :(得分:0)

如果它对某人有帮助,我很快就会把它放在一起:

void printfe(char* string)
{
    for (char c= *string; c; c= *(++string))
    {
        switch (c)
        {
        case '\a': printf("\\a"); break;
        case '\b': printf("\\b"); break;
        case '\f': printf("\\f"); break;
        case '\n': printf("\\n"); break;
        case '\r': printf("\\r"); break;
        case '\t': printf("\\t"); break;
        case '\v': printf("\\v"); break;
        case '\\': printf("\\\\"); break;
        case '\'': printf("\\\'"); break;
        case '\"': printf("\\\""); break;
        case '\?': printf("\\?"); break;
        default: (c < ' ' || c > '~') ? printf("\\%03o", c) : putchar(c); break;
        }
    }
}

(请注意c < ' ' || c > '~'的潜在不可移植性,我想避免任何库引用。)