isalpha:如果argv不是字母表。如何调整?

时间:2014-06-02 08:41:38

标签: c++ c

我创建了一个程序,它接受2个命令行参数,其中第一个参数是文件名本身,第二个是字母关键字。如果我必须拒绝任何数字参数,我该怎么做,或者我写什么?

我的伪代码:

  

如果argv [1]不是字母,则拒绝它(返回1)。

我该怎么做?对不起,我是计算机编程的新手,特别是C。

编辑: 第二个参数是一个字符串。我必须检查用户输入的字符串是否没有数字值。如果用户输入一个数字或一个带数字的字符串(如bacon11),我的程序应该拒绝它并返回1;我该怎么办?

我的代码如下所示:

 // Reject numeric value
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
    if //TODO: if letter is not a letter reject it.
    {
        return 1;
    }
}

我应该在TODO线上写什么?我无法对代码进行调整!

2 个答案:

答案 0 :(得分:4)

您可以使用isalpha功能。

编辑:您的代码似乎处于良好状态。不过,我不会做你的工作,但我可以给你一些线索!

  • 检查this tutorials以了解if语句(您还可以查看isalpha示例)。
  • 别忘了argv是一个二维字符数组。因此,要获得参数的特定字符,您可以执行以下操作:argv[i][j]
  • 检查isalpha功能的返回值以测试角色。

答案 1 :(得分:1)

从最普遍的意义上说,这可能是一个棘手的问题,因为 “alphabetic”的定义可能依赖于locale,并且会 取决于环境使用的编码;如果编码 是UTF-8(今天的常见情况),因为它可能非常困难 你必须处理多字节字符。

另一方面,您声明第二个参数是 字母关键字。如果有固定数量的关键字 (而且他们不会是其他关键词),这是最简单的解决方案 只是在关键字表中查找参数;如果你 没有找到它,这是一个错误。类似的东西:

static std::string keywords[] =
{
    "keyword1",
    "keyword2",
    //  ...
};

if ( std::find( std::begin( keywords ), std::end( keywords ), argv[2] )
        == std::end( keywords ) ) {
    //  Error, keyword not found.
}

或者,如果是“字母”,则表示中的26个字符中的一个 英文字母(并且可以排除重音字符,或 西里尔文,或中文,或类似的东西),往往是 如果一个人只关心关键词,那么你可以 使用isalpha检查每个字符是否为字母 功能(当然是正确的):

if ( std::find_if( argv[2], argv[2] + strlen( argv[2] ),
            []( unsigned char ch ) { return !isalpha( ch ); } )
        != argv[2] + strlen( argv[2] ) ) {
    //  Error, non alphabetic found...
}

正如所写,这仅适用于C ++ 11;旧版本的 C ++,它更复杂。它非常有限;通常, 经验丰富的C ++程序员所做的第一件事是设置全局 locale到他的用户,可能不是“C”。