这个程序的几乎每一行至少有一个错误。
这对于那些有一大堆不正确的意见出来有没有一个标准问题(最重要的是,只有strtol
/strtoul
/strtod
家庭的功能应该用于字符串转换为数字;从不使用atoi
家庭和never use scanf
)所以我要给出一个完整的工作示例,如何正确编写该程序,包括正确使用注释。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
long read_number_in_range(const char *prompt, long lo, long hi)
{
/* a signed 64-bit number fits in 21 characters max, +1 for '\n', +1 for NUL */
char buf[23], *endp;
long rv;
for (;;) {
puts(prompt);
if (!fgets(buf, sizeof buf, stdin)) {
perror("stdin");
exit(1);
}
errno = 0;
rv = strtol(buf, &endp, 10);
if (endp != buf && (*endp == '\0' || *endp == '\n')
&& !errno && rv >= lo && rv <= hi) {
return rv;
}
puts("?Redo from start");
}
}
int main(void)
{
long val = read_number_in_range("Enter the int value of r", 0, 100);
/* do something with val here */
return 0;
}
阅读关于行由行原计划的挑剔。
#include <stdio.h>
正确。
// function prototype for the function input
评论冗余代码。
int input(int);
函数签名不正确(请参阅函数体的注释)。
// function prototype for the function validate
评论冗余与代码。
int validate(int);
函数签名不正确(请参阅函数体的注释)。
//main function
评论冗余代码。
int main(void)
{
正确。
//calling the function input
评论冗余代码。
input(int x)
- 变量不能内部函数调用的表达式来声明。
- 函数的返回值被忽略。
- 在行尾缺少分号。
//calling the function validate
注释冗余的代码。
validate(int y)
- 值从
input
返回应该传递给validate
,想必,而不是一个新的未初始化的变量。
- 变量不能在函数调用表达式中声明。
- 函数的返回值被忽略。
- 在行尾缺少分号。
return 0;
}
正确的。
// Function definition for input
评论冗余代码。
int input(int a)
{
参数a
是不必要的。
int r;
正确。
printf("Enter the int value of r\n");
轻微:使用puts
当没有什么格式时。
scanf("%d",&r);
Never use scanf。
}
缺失return r;
。
// Function definition for validate
评论冗余与代码。
int validate(int b)
{
函数没有返回值,所以应该是void validate(int b)
。
int r;
不必要的变量。
if(r>= 0 && r<= 100)
r
应该b
在这条线上。
printf("Valid number");
else
printf("Invalid");
轻微:再次,puts
。
}
正确。
你调用函数的方式是完全错误的。我认为最好告诉你阅读这本书,而不是告诉你他们应该做什么。 –
你的函数也没有返回值,并忽略输入参数。 – interjay
你不能仅仅猜测C语法。您实际上必须了解源代码中的每一行是什么意思。 – Lundin