输入整数时,我有关于打印多个表的C程序。我还想检查整数,如果我输入了错误的类型,请注意错误,例如" 1a"将显示"错误的输入! "或" -5"将显示"输入的数字必须大于0"。请帮助我一些人。感谢阅读!这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int n;
printf ("Enter an integer: ");
scanf ("%d", &n);
check_input (n);
multible (n);
}
int clean_stdin ()
{
while (getchar () != 'n') {
}
return 1;
}
void check_input (int n)
{
char c;
do {
printf ("Enter an integer: ");
} while (((scanf ("%d%c", &n, &c) != 2 || c != 'n') && clean_stdin ()));
printf ("done, number is %d", n);
return 0;
}
int multible (int n)
{
for (int i = 1; i <= 10; ++i) {
printf ("%d * %d = %d \n", n, i, n * i);
}
return 0;
}
答案 0 :(得分:1)
你的代码是混乱的,温和地说。您检查c != 'n'
,检查c != '\n'
。 'n'
是ASCII字符110
,'\n'
是换行符字符(ASCII 10)。
接下来,clean_stdin
的返回类型应为void
- 您什么都不返回,check_input
的返回类型应该是允许您指示成功/失败的校验。您不使用argc
或argv
,因此main()
的声明应为int main (void)
。您不能使用stdlib.h
中声明的任何函数,因此不需要包含该标头。 main()
中没有显示任何功能,因为它们是在main()
之后声明的,并且没有指定函数原型上面main()
。
让我们看看你如何做你想做的事情。首先,让我们清理clean_stdin
,这样就可以完成预期的工作,例如。
void clean_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
接下来,如果您使用scanf
(或任何一系列功能),则必须检查返回,并通过生成手册{{来处理用户取消输入的情况1}},您必须解决匹配或输入失败的情况(例如,返回小于指定的转换次数),最后,您确定并处理良好的输入案例,使用EOF
来删除clean_stdin
中保留的所有字符,这样他们就不会在下次通话时咬你。
由于您的目的是获取整数输入,因此无需获取它,然后在单独的函数中检查它,只需创建一个填充整数值的函数(其地址作为参数传递)并返回stdin
表示失败或1
表示成功,例如
0
您的int get_int_input (int *n)
{
*n = 0;
for (;;) {
int rtn, tmp;
printf ("Enter an integer: ");
rtn = scanf ("%d", &tmp);
if (rtn == EOF) { /* handle user canceled input */
fputs ("(user canceled input).\n", stderr);
return 1;
}
if (rtn == 1) { /* good input, set *n = tmp, clean, return */
*n = tmp;
clean_stdin();
return 0;
}
/* handle matching or input failure */
fputs ("error: invalid input.\n", stderr);
clean_stdin();
}
}
功能将按原样运行,但您的循环限制与通常看到的限制相反,例如: multible
,在那里进行调整:
i = 0; i < 10
然后剩下的就是获得所需的输入并调用int multible (int n)
{
for (int i = 0; i < 10; ++i) {
printf ("%d * %d = %d \n", n, i + 1, n * (i + 1));
}
return 0;
}
,例如
multible
接下来,始终使用警告启用进行编译,不接受代码,直到干净地编译而不发出警告。要启用警告,请将int main (void)
{
int n;
if (get_int_input (&n))
return 1;
multible (n);
return 0;
}
添加到-Wall -Wextra
或gcc
编译字符串中。 (添加clang
以获得其他几个警告)。对于-pedantic
,您可以使用clang
。对于 VS (windoze上的-Weverything
),请添加cl.exe
(或/Wall
以限制一些无关的警告)。阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线。您可以通过简单地聆听编译器告诉您的内容,从大多数教程中学到很多关于编码的知识。
完全放弃,您可以执行以下操作:
/W3
在启用警告的情况下进行编译
#include <stdio.h>
void clean_stdin ()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int get_int_input (int *n)
{
*n = 0;
for (;;) {
int rtn, tmp;
printf ("Enter an integer: ");
rtn = scanf ("%d", &tmp);
if (rtn == EOF) { /* handle user canceled input */
fputs ("(user canceled input).\n", stderr);
return 1;
}
if (rtn == 1) { /* good input, set *n = tmp, clean, return */
*n = tmp;
clean_stdin();
return 0;
}
/* handle matching or input failure */
fputs ("error: invalid input.\n", stderr);
clean_stdin();
}
}
int multible (int n)
{
for (int i = 0; i < 10; ++i) {
printf ("%d * %d = %d \n", n, i + 1, n * (i + 1));
}
return 0;
}
int main (void)
{
int n;
if (get_int_input (&n))
return 1;
multible (n);
return 0;
}
示例使用/输出
考虑输入错误和用户取消的情况:
$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o bin/getintinput getintinput.c
有效的输入案例:
$ ./bin/getintinput
Enter an integer: foo
error: invalid input.
Enter an integer: foo
error: invalid input.
Enter an integer: (user canceled input).
仔细看看,如果您有其他问题,请告诉我。
答案 1 :(得分:0)
看一下strtol函数。请考虑如何处理错误。使用它,您可以轻松创建整数测试函数