好,所以我是c / c ++的初学者,我正在创建一个小程序,该程序检查用户提供的输入是否为有效数字,如果是,则打印“它是数字”,否则将打印“这是一个字符串”
一些示例输出
1 - is a number
-1.1 - is a number
1......1 - is a character string
three - is a character string
.12 is a character string
+0.12 is a number
ABC123ABC - is a character string
我的代码中出现此错误。如果有人可以帮助我解决此问题,我将非常感激。 TIA
cpp:52:23:错误:从'char'到'char *'的无效转换[-fpermissive]
if(!isNum(c [i]))
{ ~~~ ^ task1.cpp:5:19:注意:初始化'bool isNum(char *)'的参数1 bool isNum(char * p){
我的代码
#include <iostream>
bool isNum(char * p){
if (NULL == p || *p == '\0'){
return false;
}
int dot = 0;
int plus = 0;
int minus = 0;
while(*p){
char a = *p;
switch (a)
{
//Only allows 1 dot
case '.':
if (++dot > 1){
return false;
}
break;
//only allows 1 plus sign
case '+':
if (++plus > 1){
return false;
}
//only allows 1 minus sign
case '-':
if (++minus > 1){
return false;
}
//Only allows 0-9
default:
if (a < '0' || a > '9'){
return false;
}
}
p++;
}
return true;
}
int main(){
//char array of size 1024
char c[1024];
std::cout << "Enter something: ";
std::cin >> c;
for(int i = 0; i < sizeof(c); i++){
if (!isNum(c[i])){
std::cout << c << " is a character string";
}
else {
std::cout << c << " is a number";
}
}
}
答案 0 :(得分:1)
您去了,我已经评论了我已更改的内容
#include <iostream>
bool isNum(char * p) {
if (NULL == p || *p == '\0') {
return false;
}
int dot = 0;
char a = *p;
if (a<'0' || a>'9') {
if (a != '-' && a != '+') { return false; }
else p++;
}
if (*p<'0' || *p>'9') return false;
p++;
while (*p != '\0') {
a = *p;
switch (a)
{
//Only allows 1 dot
case '.':
if (++dot > 1) {
return false;
}
p++;
if (*p == '\0') return false;
break;
default:
if (a < '0' || a > '9') {
return false;
}
p++;
break;
}
}
return true;
}
int main() {
//char array of size 1024
char c[1024];
std::cout << "Enter something: ";
std::cin >> c;
// you don't need to loop through every character just pass your array of characters & your function is looping through it
if (!isNum(c)) {
std::cout << c << " is a character string";
}
else {
std::cout << c << " is a number";
}
}
答案 1 :(得分:1)
如果您想练习复杂的算法,那么解析数字是一个很好的练习。但是,如果您的目标是编写有用的简单程序,那么您走错了路。在C ++中,C ++标准库已经解决了许多常见任务,您只需使用它们即可。
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string line;
if (!std::getline(std::cin, line)) {
std::cerr << "error reading the line\n";
return 1;
}
std::istringstream in{line};
double num;
if (in >> num && in.peek() == EOF) {
std::cout << "it's a number, " << num << "\n";
} else {
std::cout << "it's not a number\n";
}
}
上面的代码比您的代码更高级。最重要的是,它可以处理任意长行而不会导致程序崩溃。
我对C ++标头并不十分熟悉,因此我可能忘记了包含其他标头。但是即使我没有测试它,其余的代码也应该没问题。
答案 2 :(得分:1)
以下功能isNumber
将为您服务。
在这里,我使用了动态字符序列std::string
,它使我们能够输入比std::string::max_size
短的任何大小的字符串。
我们可以通过std::isdigit
检查给定字符是否为数字。
没有多余的副本和对象创建将表现出良好的性能。
在输入字符串的左侧和右侧不允许使用空格字符。
我还编写了迭代器的显式类型,并避免使用auto
,因为您正在标记C++98
:
#include <string>
#include <cctype>
bool isNumber(const std::string& s)
{
// this also validates the following access to s[0]
if(s.empty()){
return false;
}
const std::size_t offset = (s[0] == '+' || s[0] == '-') ? 1 : 0;
std::string::const_iterator begin = s.begin() + offset;
// this also validates the following dereferencing begin
if(begin == s.end()){
return false; // false if just a sign "+" or "-"
}
if(!std::isdigit(static_cast<unsigned char>(*begin))){
return false; // e.g. "+.123"
}
bool isdecimal = false;
for(std::string::const_iterator it = ++begin; it != s.end(); ++it)
{
if (!std::isdigit(static_cast<unsigned char>(*it)))
{
if(!isdecimal && (*it == '.'))
{
isdecimal = true;
if((it+1) == s.end()){
return false; // e.g. "+1."
}
}
else{
return false;
}
}
}
return true;
}
现在,轻松实现主要功能:
#include <iostream>
int main()
{
std::string s;
std::cout << "Enter something: ";
std::getline(std::cin, s);
std::cout << std::endl;
std::cout
<< s << " is a "
<< (isNumber(s) ? "number." : "character string.");
return 0;
}