我正在尝试开发一个员工管理系统,该系统将员工信息作为输入,并相应地打印输出。
结构:
struct employee
{
char empId[10];
char name[20];
char empType[10];
int dd, mm, yyyy;
};
检查字符串是否只包含整数的程序:
void checkValidId(char *id)
{
int count = 0, i;
for(i = 0; i < strlen(id); i++)
{
if(id[i] >= '0' && id[i] <= '9')
{
count++;
}
}
if(count == strlen(id))
// continue executing next statements of input() function
else
// take the empId input again
}
获取输入的函数:
struct employee input()
{
struct employee e;
printf("Enter Employee ID: ");
scanf("%s", &e.empId);
checkValidId(e.empId);
// next statements ....
}
这里我试着检查输入的字符串empId是否只包含整数,这是由checkValidId()完成的,如果是,那么程序继续执行下一个语句,否则我想再次获取输入的empId,怎么做?
请求支援!
谢谢!
2条答案
按热度按时间exdqitrt1#
包括标头
<ctype.h>
,并使用isdigit
测试字符是否在集合'0'
...'9'
中。包括标头
<stdbool.h>
,并将checkValidId
的签名更改为以便向调用函数指示结果。
在
checkValidId
中,循环字符串中的每个字符。如果当前字符不是数字,则立即从函数返回false
。如果循环完成,则所有字符必须是数字,然后可以返回true
。注意,这里没有理由调用
strlen
,只需循环直到当前字符为空终止字节。&e.empId
的类型为char (*)[10]
,即10个字符数组的 * 指针 *。scanf
说明符"%s"
要求类型为char *
或pointer-to-char
。数组在传递给函数时将 * 衰减 * 为指向其第一个元素的指针,因此此处调用scanf
的“正确”方法是scanf("%s", e.empId);
。也就是说,您必须检查
scanf
的返回值是否是 * 预期的转换次数 *,否则您将对不确定的数据进行操作。此外,未绑定的
"%s"
是as dangerous as thegets
function,因为它不知道何时停止阅读数据,并且很容易溢出提供的缓冲区。您必须提供 * 最大字段宽度 * 以防止scanf
读取过多字符。这最多应该是缓冲区大小减1,为空终止字节留出空间。安全使用
scanf
的示例:请注意,当
scanf
无法执行转换时,有问题的数据会留在流中。使用scanf
从错误输入中恢复非常困难,因此通常建议使用基于行的方法来处理用户输入。使用fgets
可以实现这一点。如果缓冲区中有空间,
fgets
在读取时会包含换行符。参见Removing trailing newline character fromfgets()
input了解strcspn
的示例用法,它也可以用作获取输入长度的方法。若要重复要求用户输入,请使用无限循环。当用户正确输入请求的数据或发生严重错误时,循环中只有
break
。下面是一个使用所讨论方法的示例程序:
正在与此程序交互:
31moq8wy2#
checkValidId
应该返回int
,这样它就可以告诉调用者id
是否有效。1.如果
checkValidId
的返回值指示错误的id,则调用方(例如input
)应循环。1.根本不需要使用
strlen
。1.不需要比较长度。可以使用更简单的算法。
1.如果检测到无效字符,我们可以停止循环
下面是重构后的代码: