C 函数以接收参数内的有效整数
我已经编写了两个函数,第一个函数从用户那里接收一个有效的整数,如果整数后面跟一个字符,则输出错误消息。除了为每个无效字符输出错误消息外,该函数还按预期工作。然而,对于我的第二个函数,我试图让第一个函数中的整数对照第二个函数的参数检查自己,但是我遇到了一个分段错误,所以我不确定我哪里出错了。第二个函数基本上只允许用户在输入的整数在最大和最小限制范围内时继续,尽管此时未指定这些限制 这是我的密码:C 函数以接收参数内的有效整数,c,function,C,Function,我已经编写了两个函数,第一个函数从用户那里接收一个有效的整数,如果整数后面跟一个字符,则输出错误消息。除了为每个无效字符输出错误消息外,该函数还按预期工作。然而,对于我的第二个函数,我试图让第一个函数中的整数对照第二个函数的参数检查自己,但是我遇到了一个分段错误,所以我不确定我哪里出错了。第二个函数基本上只允许用户在输入的整数在最大和最小限制范围内时继续,尽管此时未指定这些限制 这是我的密码: #include <stdio.h> #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
int iVal;
double dVal;
welcome();
printTitle();
double grandtotal = 1234.57;
printFooter(grandtotal);
flushKeyboard();
pause();
getInt();
getIntLimited(int lowerLimit, int upperLimit);
return 0;
}
void flushKeyboard(void)
{
int read;
while (( read = getchar()) != '\n')
return;
}
void pause(void)
{
printf("Press <ENTER> to continue...\n");
flushKeyboard();
return;
}
int getInt(void)
{
int validInt;
char NL = 'x';
while (NL != '\n') {
scanf("%d%c", &validInt, &NL);
if (NL != '\n') {
flushKeyboard();
printf("Invalid integer, please try again: \n");
}
}
return validInt;
}
int getIntLimited(int lowerLimit, int upperLimit)
{
int limit;
do {
limit = getInt();
if(lowerLimit > limit || limit > upperLimit) {
printf("Invalid value, %d < %d < %d: ", lowerLimit, limit, upperLimit);
}
}
while(lowerLimit < limit && limit < upperLimit);
return limit;
}
#包括
#包括
内部主(空){
国际竞争力;
双dVal;
欢迎();
printTitle();
双倍总计=1234.57;
打印页脚(总计);
刷新键盘();
暂停();
getInt();
getIntLimited(整数下限,整数上限);
返回0;
}
虚空刷新键盘(虚空)
{
int-read;
而((read=getchar())!='\n')
返回;
}
作废暂停(作废)
{
printf(“按继续…\n”);
刷新键盘();
返回;
}
int getInt(无效)
{
int validInt;
char NL='x';
而(NL!='\n'){
scanf(“%d%c”、&validInt、&NL);
如果(NL!='\n'){
刷新键盘();
printf(“无效整数,请重试:\n”);
}
}
返回有效期;
}
int getIntLimited(int下限,int上限)
{
整数极限;
做{
limit=getInt();
如果(下限>限制| |限制>上限){
printf(“无效值,%d<%d<%d:”,下限,上限);
}
}
while(下限<上限&&limit<上限);
退货限额;
}
scanf(“%d%c”,validInt,NL)
提供未定义的行为。。。您需要传递变量的地址,而不是值。此外,您应该检查其返回值以确定是否扫描和分配了字段。+对于@Dmitri写入的内容,scanf
扫描输入缓冲区直到'\n'
或'
,因此您的scanf
应该是scanf(%d',&validInt)
如果要检查整数是否有效,则需要将整个输入作为字符串读取,然后对其进行解析并搜索非法字符(假设输入如下:12PP2
)。检查完成后,字符串应转换为整数。getchar()
输入的值也需要检查EOF。因此,由getchar()
返回值设置的变量需要是int
,而不是char
。发布的代码缺少很多项,如几个函数的定义、所需的#include
语句等。该问题涉及运行时问题,但是代码没有编译,实际输入、预期输出和实际输出都没有发布。所以这个问题是离题的,我忽略了其他函数,因为我认为它们与我所关注的函数没有任何关系。我已经更新了Dmitri的建议,使用地址而不是变量,以及用户的建议将char更改为int,第一个函数现在运行得很好。我处理了很多printf语句,完全忘记了传递地址,而不是scanf的值。函数getInt的唯一问题是它输出多个错误消息。例如,如果您输入2das,您将收到3条错误消息,而不是一条。