嗨我在c ++中有一个未知的字符串,包含" \ n" " \吨"等等 说;
string unknown1=read_from_file();
如果unknown1 =" \ n \ t \ n \ t \ n \ n \ n \ n \ n&n"现在我要打印
"\n\t\n\t\n\n\n\n\n"
除了一堆空的空间之外,还有一个屏幕......我应该怎么做?记住我不知道什么是未知的......
要强调,我知道如果我们改变" \ n"我们可以明确地打印\ n进入" \ n"对于每一个这样的角色......但问题在于我不知道里面的内容是什么......它是从文件中读取的......
感谢您的回答,但我们还有其他问题:
回答的程序还有一个问题...假设我不知道文件中唯一可能的特殊字符是\ n或\ t ...可能有类似\ u的东西? \ l?我想我们不能用尽所有可能性吗?有没有内置的C ++函数只输出相应的字符?
答案 0 :(得分:3)
\n
,\t
是转义序列,但您可以通过在它们之前添加额外的\
来打印它们,\\
用于获取单个反斜杠。单个反斜杠意味着它是一个转义序列(如果它是有效的),但是两个反斜杠表示反斜杠字符,因此每当您需要输出反斜杠时,只需添加其中两个。
所以,如果你使用
string unknown1="\\n\\t\\n\\t\\n\\n\\n\\n\\n";
您将获得所需的输出。
如果您正在阅读文件,请执行此类操作
string unknown1="\n\t\n\t\n\n\n\n\n";
for ( int i = 0 ; i < unknown1.length() ; i++ )
{
if( unknown1[i] == '\n')
cout<<"\\n";
}
就像那样,您必须检查可能使用的每个escape sequence。
答案 1 :(得分:1)
对您担心的不可打印字符运行特定检查。
char c;
while(c!=EOF){
if(c=='\n')printf("\\n");
if(c=='\t')printf("\\t");
and so on and so forth.
c = the next charater;
}
哎呀,我写的是C而不是C ++,但@Arun A.S的语法正确
答案 2 :(得分:1)
见下面的例子。您可以将自己的字符添加到switch
以扩展它处理的字符。
#include <iostream>
#include <string>
std::string escapeSpecialChars(const std::string& str)
{
std::string result;
for(auto c : str)
{
switch(c)
{
case '\n':
result += "\\n";
break;
case '\t':
result += "\\t";
break;
default:
result += c;
break;
}
}
return result;
}
int main()
{
std::string str = "\n\n\n\t";
std::cout << escapeSpecialChars(str);
return 0;
}
答案 3 :(得分:0)
您可以使用std :: map创建自己的函数来打印字符:
void printChar( const char ch )
{
static const std::map< char, std::string > char_map = {
{ '\n', "\\n" }
// add mappings as needed
};
auto found = char_map.find( ch );
if ( found != char_map.end() )
std::cout << found->second;
else
std::cout << ch;
}
// usage
std::string str = "a\nbc";
for ( auto ch : str ) printChar ( ch );