我正在用C ++创建加密/解密程序,我使用三个用户提供的数字来自定义加密。我在cplusplus.com上读到了关于isdigit()的内容,并根据它创建了一个函数:
bool is_numeric(char *string)
{
int sizeOfString = sizeof(string);
int iteration = 0;
bool isNumeric = true;
while(iteration < sizeOfString)
{
if(!isdigit(string[iteration]))
{
isNumeric = false;
break;
}
iteration++;
}
return isNumeric;
}
然而,它似乎不起作用。无论我给它一个数字,还是一个非数字字符,它仍然返回false。我的做法有什么问题。
答案 0 :(得分:5)
我想我会使用标准算法:
bool is_numeric(char const *string)
{
return std::all_of(string, string+strlen(string),
[](unsigned char c) { return ::isdigit(c); });
}
请注意,就目前而言,您的代码可能(通常会)具有未定义的行为(如果字符串包含在编码为char时作为负数的任何内容)。此代码通过将char
转换为传递给lambda的unsigned char
来防止这种情况 - 这就是为什么我使用lambda而不是仅仅将::isdigit
作为谓词传递给{{1} }。
答案 1 :(得分:3)
您正在计算sizeOfString
错误。试试这个。
bool is_numeric(char *string)
{
int sizeOfString = strlen(string);
int iteration = 0;
bool isNumeric = true;
while(iteration < sizeOfString)
{
if(!isdigit(string[iteration]))
{
isNumeric = false;
break;
}
iteration++;
}
return isNumeric;
}
您可能还想添加检查.
字符的功能!现在,如果你的字符串是一个整数,你的代码只返回true。
答案 2 :(得分:1)
while ('0' <= *string && *string <= '9')
++string;
return *string == '\0';
或者,如果您更喜欢使用isdigit
:
while (is digit((int)*string))
++string;
return *string == '\0';
答案 3 :(得分:1)
另一种可能的解决方案是使用字符串流:
bool isNumeric(const string& s) {
stringstream ss(s);
int val;
ss >> val;
return ! ss.fail() && ss.eof();
}
如果给定的字符串不是数字,stringstream :: operator&gt;&gt;(int&amp;)将使stringstream的failbit设置,你需要检查字符串中的所有字符串是否只是一个整数(没有别的) ,所以你也测试了eof位。 这也适用于负数,如果要接受浮点数,也可以将int更改为double。