我创建了一个程序,它接受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线上写什么?我无法对代码进行调整!
答案 0 :(得分:4)
您可以使用isalpha功能。
编辑:您的代码似乎处于良好状态。不过,我不会做你的工作,但我可以给你一些线索!
argv[i][j]
答案 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”。