在我的程序中,我需要验证传递给程序的参数是否为整数,所以我创建了这个小函数来处理用户键入“1st”而不是“1”的情况。
问题是它根本不起作用。我尝试调试,我可以告诉你的是参数是12,长是2.(12是我要测试的值,2是传递给函数的数字的数量)
int intOnly(char *toCheck, int longeur) {
int i = 0;
while (i < longeur) {
switch (toCheck[i]) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case ' ':
i++;
default:
return 0;
break;
}
return 1;
}
}
我希望一切都清楚, 谢谢你的帮助;)
答案 0 :(得分:11)
如果要检查字符是否为十位数之一,则需要使用字符常量'0'
,'1'
等(不是整数常量,0
, 1
等。)。
答案 1 :(得分:7)
一旦你修复了已经指出的问题,你应该查找isdigit
和isspace
并使用它们来更清晰地编写函数。另一种可能性是使用strcspn
或strpbrk
之类的内容进行搜索。
答案 2 :(得分:5)
只需使用strtol
这将转换整数,您可以从第三个参数判断它是否成功。
有关说明,请参阅strtol(3)
答案 3 :(得分:1)
首先,我很惊讶您的代码通过名为long的变量进行编译。但是,您的真正问题是您使用的是数字0-9,而不是切换中的字符'0'
到'9'
。
答案 4 :(得分:1)
您可能希望在break;
语句后添加i++;
语句。否则,您将始终“落入”default
分支并返回0。
答案 5 :(得分:1)
除了其他答案外,请考虑使用isdigit
。还可以考虑重命名您的函数以反映其实际功能(例如intsAndSpacesOnly
)
答案 6 :(得分:1)
您可以将isdigit
和isspace
功能用作:
int intOnly(char *toCheck, int len) { // long is reserved word..use len.
int i = 0;
while (i < len) {
if(!isdigit(toCheck[i]) && !isspace(toCheck[i]))
return 0;
i++;
}
return 1;
}
长是一个不能用作标识符的关键字。
答案 7 :(得分:1)
如果您使用ctype.h,特别是isdigit或
,您可以让您的生活更轻松,代码更短if(toCheck[i] >= '0' && toCheck[i] <= '9' || toCheck[i] == ' '){
答案 8 :(得分:1)
我假设你的意思是一个正整数,因为如果传入负数,你的代码将会失败,类似地,如果传入指数(例如,1000为1e3)。后者可能很少见,你需要担心,但前者可能需要考虑 - 我不知道你的目的是什么目的,但只是单挑: - )