我看到一个看起来像这样的字符串:
“玛丽有一只小羊羔\n\r它的羊毛像雪一样白”
\n\r 是这些 (0x5C6E5c72) 的实际 ascii 字符
有没有一种“简单”的方法来获取字符串并将 \n\r 转换为 0x0D0A?
我正在考虑将 0x5C6E5c72 标记为一个数组,然后用 NLCR 格式化新字符串。
任何人都知道是否有一个有用的 c 库或任何更容易做到这一点的东西?
这只是文本搜索和替换。
请注意,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. */
}
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;
}