0

我看到一个看起来像这样的字符串:

“玛丽有一只小羊羔\n\r它的羊毛像雪一样白”

\n\r 是这些 (0x5C6E5c72) 的实际 ascii 字符

有没有一种“简单”的方法来获取字符串并将 \n\r 转换为 0x0D0A?

我正在考虑将 0x5C6E5c72 标记为一个数组,然后用 NLCR 格式化新字符串。

任何人都知道是否有一个有用的 c 库或任何更容易做到这一点的东西?

4

2 回答 2

1

这只是文本搜索和替换。

请注意,0D0A例如 MSDOS 后代使用的标准 ASCII 换行符序列是 CR LF 而不是 LF CR,它由 表示\r\n,而不是由表示\n\r

遵循我在 C 中用于搜索和替换的一般模式……</p>

void fix_newlines( char * base ) {
    char * read = base;
    char * write = base;
    while ( char * next = strstr( read, "\\n\\r" ) ) {
        memmove( write, read, next - read ); /* Copy text. */
        write += next - read; /* Advance past text. */
        read = next + 4; /* Advance past text and escape sequences. */
        strcpy( write, "\r\n" ); /* Translate to CRLF. */
        write += 2; /* Advance past CRLF. */
    }
    strcpy( write, read ); /* Copy trailing text. */
}
于 2013-09-10T23:58:55.937 回答
1

gcc (GCC) 4.7.3: gcc -Wall -Wextra -std=c99 echo.c

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

// Destructively interpret escape codes in a string.
void interp_backslash(char* str) {
  char* r = str;
  char* w = str;

  while (*r) {
    *w = *r;
    if ('\\' == *r) {
      ++r;
      switch (*r) {
      case 'r': *w = '\r'; break;
      case 'n': *w = '\n'; break;
      case '\\': *w = '\\'; break;
      // add other cases here
      default:
        printf("error\n");
        exit(-1);
      }
    }
    ++r;
    ++w;
  }
  *w = '\0';
}

// Similar to echo -e
// For example: ./echo "mary\n\rlamb"
int main(int argc, char* argv[]) {
  for (int i = 1; i < argc; ++i) {
    interp_backslash(argv[i]);
    printf("%s", argv[i]);
    if (i != argc -1) { printf(" "); }
  }
  return 0;
}
于 2013-09-10T17:02:27.427 回答