Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的类型转换、内部代码和字符_C++_Types - Fatal编程技术网

C++中的类型转换、内部代码和字符

C++中的类型转换、内部代码和字符,c++,types,C++,Types,我正试图编写一个函数来检测由赋值定义的分隔符,我知道这不是一种好的编程风格 #define EXCLAMATION_POINT 33, but to instead do #define EXCLAMATION_POINT '!' 这是我的代码: #include <iostream> #include <ostream> using namespace std; #define PERIOD '.' #define QUESTION_MARK '?' #define

我正试图编写一个函数来检测由赋值定义的分隔符,我知道这不是一种好的编程风格

#define EXCLAMATION_POINT 33, but to instead do #define EXCLAMATION_POINT '!'
这是我的代码:

#include <iostream>
#include <ostream>
using namespace std;
#define PERIOD '.'
#define QUESTION_MARK '?'
#define EXCLAMATION_POINT '!'
#define COMMA ','
#define COLON ':'
#define SEMICOLON ';'

inline bool IsSeparator(int x) 
{
    if (isspace(x) || 
        x == PERIOD || 
        x == QUESTION_MARK ||
        x == EXCLAMATION_POINT ||
        x == COMMA ||
        x == COLON || 
        x == SEMICOLON) {
        return true;
    }
    else {
        return false;
    }
}

int main (int argc, char * const argv[]) {
    int input;
    cout << "Enter characters: \n";
    input = cin.get();
    if (!IsSeparator(input))
        cout << "true";
    else {
        cout << "false";
    }
    return 0;
}

但是在我的IsSeparator中,我如何将int类型转换为一个字符,以便与“!”进行比较呢。我想如果我做了一些类似于char惊叹号的事情,它会工作,但它不会,并且值保留在一个整数上。我在这里做错了什么?谢谢

您不需要任何演员阵容,但是:

if (!IsSeparator(input))
应该是:

if (IsSeparator(input))
此外,您的提示:

cout << "Enter characters: \n";
因为您可以在文件格式更改时对其进行更改,例如:

const char SEPARATOR = '|';
但是,通常情况下,给ASCII或任何字符集的成员指定自己的名称是没有意义的

在您的代码中,创建一个分隔符数组可能是有意义的。为了便于键入,我没有显示您使用的所有分隔符:

const char SEPARATORS[] = {':', '|', '!', 0 };
然后让验证函数在数组上迭代。注意:在本例中,数组也可以表示为字符串文字:

const char * const SEPARATORS = ":|!";

您不需要任何演员阵容,但:

if (!IsSeparator(input))
应该是:

if (IsSeparator(input))
此外,您的提示:

cout << "Enter characters: \n";
因为您可以在文件格式更改时对其进行更改,例如:

const char SEPARATOR = '|';
但是,通常情况下,给ASCII或任何字符集的成员指定自己的名称是没有意义的

在您的代码中,创建一个分隔符数组可能是有意义的。为了便于键入,我没有显示您使用的所有分隔符:

const char SEPARATORS[] = {':', '|', '!', 0 };
然后让验证函数在数组上迭代。注意:在本例中,数组也可以表示为字符串文字:

const char * const SEPARATORS = ":|!";

是什么让你认为这些定义是一个很好的实践?你需要处理2015年的感叹号重新定义吗

可以安全地假设感叹号将由“!”表示从现在到永远。就像常数一样,明天也将用1表示


您不需要定义感叹号,就像您不需要定义一、减或INT一样。

是什么让您认为这些定义是一种很好的实践?你需要处理2015年的感叹号重新定义吗

可以安全地假设感叹号将由“!”表示从现在到永远。就像常数一样,明天也将用1表示


你不需要定义感叹号,就像你不需要定义一、负号或整数一样。

嗯,我不确定我是否完全理解你所说的定义和样式,但最好的方法是根本不要这样做。只需将句点替换为“.”,依此类推。如果你真的想要常数,至少让它们成为static const char Period='.',根本不需要使用define,更不用说尖叫了。:]另外,你的代码对我来说也像预期的那样工作。呃,我不确定我是否完全理解你所说的定义和风格,但最好的方法是根本不要这样做。只需将句点替换为“.”,依此类推。如果你真的想要常数,至少让它们成为static const char Period='.',根本不需要使用define,更不用说尖叫了。:]另外,您的代码对我来说也能正常工作。@Kornel:据我所知,Unicode将前255个字符与ASCII匹配。所以保持“!”。但是我对Unicode几乎一无所知。嗯,有两种可能:一种是单个字符“!”是一个感叹号,在这种情况下,针对“!”进行测试或者感叹号由多个字符组成的序列表示,但如果是这样,定义也没有帮助,因为单个字符之间的比较是行不通的。在这种情况下,您必须与一系列字符进行比较。因此,您需要类似于is_感叹号的函数,而不是将字符与字符进行比较define@Kornel:据我所知,Unicode将前255个字符与ASCII匹配。所以保持“!”。但是我对Unicode几乎一无所知。嗯,有两种可能:一种是单个字符“!”是一个感叹号,在这种情况下,针对“!”进行测试或者感叹号由多个字符组成的序列表示,但如果是这样,定义也没有帮助,因为单个字符之间的比较是行不通的。在这种情况下,您必须与一系列字符进行比较。因此,您需要类似于is_感叹号的函数,而不是将字符与define进行比较