C++ 试图得到一个C++;switch语句以识别空格、制表符等

C++ 试图得到一个C++;switch语句以识别空格、制表符等,c++,C++,我正在尝试编写一个程序,它接受输入并返回输入,所有空格、制表符、换行符都替换为任意文本 我的代码编译得很好,但当程序运行时,所有空格等都被忽略。即,我输入“Sometext”,输出将是“Sometext” 我的代码如下: // escapechars.cpp #include <iostream> std::string escapeChar(char ch) { //Read in a character and return //a string.

我正在尝试编写一个程序,它接受输入并返回输入,所有空格、制表符、换行符都替换为任意文本

我的代码编译得很好,但当程序运行时,所有空格等都被忽略。即,我输入“Sometext”,输出将是“Sometext”

我的代码如下:

// 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”/代码>。