-2
我正在從磁盤加載文本文件到我的C應用程序。一切正常,但文本包含多個轉義字符,如\ r \ n和加載文本後,我想保留這些字符的計數,並相應地顯示。C從文件加載文本,打印轉義字符
這時如果我使用的字符串的printf,它表明我:
你好\ nMan \ n
這樣做的有快捷方式?
我正在從磁盤加載文本文件到我的C應用程序。一切正常,但文本包含多個轉義字符,如\ r \ n和加載文本後,我想保留這些字符的計數,並相應地顯示。C從文件加載文本,打印轉義字符
這時如果我使用的字符串的printf,它表明我:
你好\ nMan \ n
這樣做的有快捷方式?
似乎有不被此標準的功能,但你可以滾你自己:
#include <stdlib.h>
#include <stdio.h>
/*
* Converts simple C-style escape sequences. Treats single-letter
* escapes (\t, \n etc.) only. Does not treat \0 and the octal and
* hexadecimal escapes (\033, \x, \u).
*
* Overwrites the string and returns the length of the unescaped
* string.
*/
int unescape(char *str)
{
static const char escape[256] = {
['a'] = '\a', ['b'] = '\b', ['f'] = '\f',
['n'] = '\n', ['r'] = '\r', ['t'] = '\t',
['v'] = '\v', ['\\'] = '\\', ['\''] = '\'',
['"'] = '\"', ['?'] = '\?',
};
char *p = str; /* Pointer to original string */
char *q = str; /* Pointer to new string; q <= p */
while (*p) {
int c = *(unsigned char*) p++;
if (c == '\\') {
c = *(unsigned char*) p++;
if (c == '\0') break;
if (escape[c]) c = escape[c];
}
*q++ = c;
}
*q = '\0';
return q - str;
}
int main()
{
char str[] = "\\\"Hello ->\\t\\\\Man\\\"\\n";
printf("'%s'\n", str);
unescape(str);
printf("'%s'\n", str);
return 0;
}
此功能取消轉義到位的字符串。這是安全的,因爲非轉義字符串不能比原始字符串長。 (另一方面,這可能不是一個好主意,因爲相同的char緩衝區用於轉義字符串和非轉義字符串,並且您必須記住它保存的是哪一個。)
此函數不會將數字序列爲八進制和十六進制符號。有more complete implementations左右,但它們通常是某些庫的一部分,並依賴於其他模塊,通常用於動態字符串。
也有類似的functions for escaping一個字符串,當然。
這很奇怪。請提供您的代碼 – maxpovver 2015-01-21 07:14:39
向我們展示您的代碼的相關部分(您如何閱讀和打印文件的內容)以及文本文件的內容 – 2015-01-21 07:20:26
因此,該文件實際上包含字符串的轉義版本,並且您希望例如,換行符是真正的新行? – 2015-01-21 07:30:40