C++ 试图得到一个C++;switch语句以识别空格、制表符等
我正在尝试编写一个程序,它接受输入并返回输入,所有空格、制表符、换行符都替换为任意文本 我的代码编译得很好,但当程序运行时,所有空格等都被忽略。即,我输入“Sometext”,输出将是“Sometext” 我的代码如下:C++ 试图得到一个C++;switch语句以识别空格、制表符等,c++,C++,我正在尝试编写一个程序,它接受输入并返回输入,所有空格、制表符、换行符都替换为任意文本 我的代码编译得很好,但当程序运行时,所有空格等都被忽略。即,我输入“Sometext”,输出将是“Sometext” 我的代码如下: // escapechars.cpp #include <iostream> std::string escapeChar(char ch) { //Read in a character and return //a string.
// escapechars.cpp
#include <iostream>
std::string escapeChar(char ch)
{
//Read in a character and return
//a string.
std::string return_string("");
switch(ch)
{
// space case
case 32:
return_string = "Space";
return return_string;
// tab case
case 9:
return_string = "TAB";
return return_string;
// carriage return case
case 10:
return_string = "CR";
return return_string;
// new line case
case 13:
return_string = "LF";
return return_string;
// backslash case
case 92:
return std::string(2, ch);
case 48-57:
return_string = "\\" + ch;
default:
return_string = ch;
return return_string;
}
}
int main()
{
std::cout << "Time to read in some characters or whatever...\n";
char value;
while (std::cin >> value)
{
std::cout << escapeChar(value);
}
return 0;
}
//escapechars.cpp
#包括
std::字符串转义码(char-ch)
{
//读入一个字符并返回
//一串。
std::字符串返回\ U字符串(“”);
开关(ch)
{
//太空箱
案例32:
return_string=“Space”;
返回字符串;
//标签盒
案例9:
return_string=“TAB”;
返回字符串;
//回车箱
案例10:
return_string=“CR”;
返回字符串;
//新线盒
案例13:
return_string=“LF”;
返回字符串;
//反斜杠箱
案例92:
返回std::string(2,ch);
案例48-57:
返回\u字符串=“\\”+ch;
违约:
return_string=ch;
返回字符串;
}
}
int main()
{
标准::cout>值)
{
标准::cout
该术语的计算结果为-9,因为它是一个减法运算符。
不幸的是,您不能在开关案例中指定范围,您可以在开关之后添加一个if-else
语句以进行最终验证。(您必须删除该开关的default
关键字)
此外,分隔符cin
使用的是空格,这意味着您将得到没有空格的单词
该术语的计算结果为-9,因为它是一个减法运算符。
不幸的是,您不能在开关案例中指定范围,您可以在开关之后添加一个if-else
语句以进行最终验证。(您必须删除该开关的default
关键字)
另外,cin
使用的分隔符是空格,这意味着您无论如何都会得到没有空格的单词。您的代码有很多问题。您注意到的一个问题是字符提取操作符>
通常跳过空格。您可以通过多种不同的方法来修复此问题。其中之一是添加std::cin>>std::noskipws;
在循环之前:
std::cout << "Time to read in some characters or whatever...\n";
char value;
std::cin >> std::noskipws; // Added
while (std::cin >> value)
{
std::cout << escapeChar(value);
}
至于其他问题,它们包括在switch语句中交换了CR和LF,case语句不支持范围,以及在switch语句的每种情况下重复return\u string;
就个人而言,我认为我的工作会有所不同。我可能会为您想要更改的输入构建一个字符串的[无序]映射,然后(很可能)使用std::transform
来处理数据的读写,并调用函数来更改单个输入
class xform {
std::map<char, std::string> changes;
public:
xform() {
changes['\n'] = "LF";
changes['\r'] = "CR";
changes['\t'] = "TAB";
changes[' '] = "SPACE";
changes['\\'] = "\\\\";
for (int i=0; i<9; i++)
changes[i + '0'] = "\\" + std::to_string(i);
// ...
}
std::string operator()(char in) {
auto pos = changes.find(in);
if (pos != changes.end())
return pos->second;
return std::string(1, in);
}
};
// ...
std::cin >> noskipws;
std::transform(std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(std::cout),
xform());
类变换{
地图变化;
公众:
xform(){
更改['\n']=“LF”;
更改['\r']=“CR”;
更改['\t']=“制表符”;
更改['']=“空格”;
更改['\']=“\\\\”;
对于(int i=0;等秒;
返回标准::字符串(1,in);
}
};
// ...
标准::cin>>noskipws;
std::transform(std::istream_迭代器(std::cin),
std::istream_迭代器(),
std::ostream_迭代器(std::cout),
xform());
另一种可能性(特别是当你这样做的速度足够快时)是使用一个输出字符串数组,并为每个可能的输入值填入正确的值。这样你在转换时就不需要任何条件了——你只需写出table[input]
。事实上,如果您正在读/写文件,那么要使文件I/O速度足够快,从而产生很大的影响(如果有的话)是相当困难的真正的区别是。您的代码有很多问题。您注意到的一个问题是字符提取操作符>
通常跳过空白。您可以通过多种不同的方法中的任何一种来解决此问题。一种方法是在循环之前添加std::cin>>std::noskipws;
:
std::cout << "Time to read in some characters or whatever...\n";
char value;
std::cin >> std::noskipws; // Added
while (std::cin >> value)
{
std::cout << escapeChar(value);
}
至于其他问题,它们包括在switch语句中交换了CR和LF,case语句不支持范围,以及在switch语句的每种情况下重复return\u string;
就个人而言,我认为我的工作会有所不同。我可能会为您想要更改的输入构建一个字符串的[无序]映射,然后(很可能)使用std::transform
来处理数据的读写,并调用函数来更改单个输入
class xform {
std::map<char, std::string> changes;
public:
xform() {
changes['\n'] = "LF";
changes['\r'] = "CR";
changes['\t'] = "TAB";
changes[' '] = "SPACE";
changes['\\'] = "\\\\";
for (int i=0; i<9; i++)
changes[i + '0'] = "\\" + std::to_string(i);
// ...
}
std::string operator()(char in) {
auto pos = changes.find(in);
if (pos != changes.end())
return pos->second;
return std::string(1, in);
}
};
// ...
std::cin >> noskipws;
std::transform(std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(std::cout),
xform());
类变换{
地图变化;
公众:
xform(){
更改['\n']=“LF”;
更改['\r']=“CR”;
更改['\t']=“制表符”;
更改['']=“空格”;
更改['\']=“\\\\”;
对于(int i=0;等秒;
返回标准::字符串(1,in);
}
};
// ...
标准::cin>>noskipws;
std::transform(std::istream_迭代器(std::cin),
std::istream_迭代器(),
std::ostream_迭代器(std::cout),
xform());
另一种可能性(特别是当你这样做的速度足够快时)是使用一个输出字符串数组,并为每个可能的输入值填入正确的值。这样你在转换时就不需要任何条件了——你只需写出table[input]
。事实上,如果您正在读/写文件,那么要使文件I/O速度足够快,从而产生很大的影响(如果有的话)是相当困难的不过,CIN默认忽略空白,如果不想使用字符使用字符,比如Tabor使用“代码>”\“T”/代码>。