我知道这是由于函数结束时没有返回引起的,但如果我只希望它在特定条件下返回,那该怎么办呢?我试图在函数中传递返回值,但它返回它看到的第一个我不想发生的暗淡。
char dimension(void)
{
char dim,d;
printf("2D or 3D?\n");
dim=getchar();
if(dim=='2'||dim=='3')
{
d=getchar();
if(d=='\n')
{
printf("You selected %cD\n",dim);
return dim;
}
else
{
for(;d!='\n';d=getchar());
if(d=='\n')
dimension();
}
}
else
{
for(;d!='\n';d=getchar());
if(d=='\n')
dimension();
}
//return dim; --> undesired return value.
}
答案 0 :(得分:0)
你的程序似乎比它需要的更复杂,问题似乎集中在处理尾随换行符。
最好编写专用于清除输入流的函数。另请注意,getchar()
会在出现错误时返回EOF
,或者如果用户从键盘发出EOF
信号,或者可能是从文件重定向输入。下面的clear_stdin()
函数会检查\n
和EOF
,以避免在这种情况下出现无限循环。
正如@IanAbbott所指出的那样,dim
应该是int
,因为getchar()
的返回类型是int
,而char
}可能不会保留EOF
的值。如果getchar()
中存在错误,则会输入无限递归,除非dimension()
明确检查EOF
。我添加了打印错误消息的代码,如果'?'
为dim
,则返回EOF
。调用函数可以通过检查'?'
来处理错误;当检测到错误时,程序可以改为exit()
。
另请注意,使用返回值声明的函数必须返回一个值。在这里,如果用户的输入是可接受的,则返回,否则返回再次调用dimension()
的结果。
#include <stdio.h>
char dimension(void);
void clear_stdin(void);
int main(void)
{
char c = dimension();
printf("%c returned from dimension()\n", c);
return 0;
}
char dimension(void)
{
int dim;
printf("2D or 3D?\n");
dim = getchar();
if (dim == EOF) {
printf("Error or EOF in getchar()\n");
return '?';
}
if (dim == '2' || dim == '3') {
int c;
if ((c = getchar()) == '\n' || c == EOF) {
printf("You selected %cD\n",dim);
return dim;
}
}
clear_stdin();
puts("Invalid selection");
return dimension();
}
void clear_stdin(void)
{
int c;
while((c = getchar()) != '\n' && c != EOF) {
continue;
}
}
示例互动
2D or 3D?
1
Invalid selection
2D or 3D?
23
Invalid selection
2D or 3D?
4
Invalid selection
2D or 3D?
3
You selected 3D
3 returned from dimension()