我想为我的程序添加双值验证。
例如:当用户输入字符串时,它会给出错误“请输入整数而不是字符串。”
我也想要“请输入一个整数而不是双值。”
我该如何申请?
/*
* HW3-3.c
*
* Created on: Oct 21, 2012
* Author: mert
*/
#include <string.h>
#include <stdio.h>
void checkTriangle(char *s1,char *s2,char *s3)
{
int i;
int found_letter = 0;
int len = strlen(s1);
int len2 = strlen(s2);
int len3 = strlen(s3);
for( i = 0; i < len; i++)
{
if(s1[i] < '0' || s1[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
}
}
for( i = 0; i < len2; i++)
{
if(s2[i] < '0' || s2[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
}
}
for( i = 0; i < len3; i++)
{
if(s3[i] < '0' || s3[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
}
}
if(found_letter) // value 0 means false, any other value means true
printf("Please enter an integer instead of string.");
else
{
int side1 = atoi(s1);
int side2 = atoi(s2);
int side3 = atoi(s3);
if ((side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1) && (side1 > 0 && side2 > 0 && side3 > 0))
{
// Deciding type of triangle according to given input.
if (side1 == side2 && side2 == side3)
printf("EQUILATERAL TRIANGLE");
else if (side1 == side2 || side2 == side3 || side1 == side3)
printf("ISOSCELES TRIANGLE\n");
else
printf("SCALENE TRIANGLE \n");
}
else
printf("\nTriangle could not be formed.");
}
}
int main(void)
{
char s[32], s2[32], s3[32];
printf("Please enter sides of triangle");
printf("\nPlease enter side 1:");
gets(s);
printf("Please enter side 2:");
gets(s2);
printf("Please enter side 3:");
gets(s3);
checkTriangle(s,s2,s3);
}
答案 0 :(得分:2)
您可以尝试解析输入并检查结果。另请注意,使用常规功能很方便,而不是重复三次验证:
/*
Returns a positive integer if a positive integer was read from input.
It will return -1 if the input is not a number,
-2 if it was not an integer,
-3 if it was not strictly positive.
Bugs: "-0" is recognized as "not a number" instead of "not positive"
"0185" is recognized as 185 instead of "not a (proper) number"
*/
int askValue(char *message)
{
int val;
char s[32];
printf("%s: ", message);
// Read string
fgets(s, sizeof(s), stdin);
// Trim string. fgets will return the \n.
if (0 == strlen(s))
return -1;
s[strlen(s)-1] = 0x0;
// Parse as an integer. 0 means it was either "0", or garbage
if (0 == atoi(s))
{
if ('0' == s[0])
val = 0; // It was a "0" (or maybe "0.17" or "0x18")
else
return -1; // Error: it was not a number
}
// Then parse as a float. "0.17" will give 0.17 which is not 0.00
if ((double)val != atof(s))
{
// Error: the string checks as a floating point value
return -2;
}
if (val <= 0)
return -3;
return val;
}
void complain(int val)
{
switch(val)
{
case -3: printf("Value must be greater than 0\n"); break;
case -2: printf("Value must be integer\n"); break;
case -1: printf("Value must be a number\n"); break;
}
}
int main()
{
int side1, side2, side3; // We could use a vector: side[3]
while ((side1 = askValue("Please enter side 1")) < 0)
complain(side1);
while ((side2 = askValue("Please enter side 2")) < 0)
complain(side2);
while ((side3 = askValue("Please enter side 3")) < 0)
complain(side3);
...
}
这是一个不同的实现,更严格。如果它是正数则返回整数值,如果是负整数则返回-2,在所有其他情况下返回-1(垃圾和浮点数)。
它仍然对“-0”有误判,它解析为“0”。
int askValue(char *message)
{
int val;
char s[32], c[32];
printf("%s: ", message);
// Read string
fgets(s, sizeof(s), stdin);
// Parse as an integer. 0 means it was either "0", or garbage
val = atoi(s);
// Now produce the expected input for val, included final \n
snprintf(c, sizeof(c), "%d\n", val);
if (strcmp(c, s))
return -1;
if (val < 0)
return -3;
return val;
}
答案 1 :(得分:0)
在浏览每个字符时,您只需检查是否有任何数字是.
。如果你找到一个,那么输入就是双倍。
void checkTriangle(char *s1,char *s2,char *s3)
{
int i;
int found_double = 0;
int found_letter = 0;
int len = strlen(s1);
int len2 = strlen(s2);
int len3 = strlen(s3);
for( i = 0; i < len; i++)
{
if(s1[i] < '0' || s1[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
} else if (s1[i] == '.') {
found_double = 1;
break;
}
}
for( i = 0; i < len2; i++)
{
if(s2[i] < '0' || s2[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
} else if (s2[i] == '.') {
found_double = 1;
break;
}
}
for( i = 0; i < len3; i++)
{
if(s3[i] < '0' || s3[i] > '9')
{
found_letter = 1; // this variable works as a boolean
break;
} else if (s3[i] == '.') {
found_double = 1;
break;
}
}
if(found_letter) // value 0 means false, any other value means true
printf("Please enter an integer instead of string.");
else if (found_double)
printf("Enter an integer, not a double");
else {
// code stays the same
}