C 批评我的函数从输入流中跳过k个字符
处理(应该是什么)一个简单的项目,从stdin获取输入并重新格式化以匹配输出规范。我只是想看看这里的专家对下面这个函数的看法,这个函数应该跳过k个字符直到行的末尾,除非k<0,它会一直跳过字符直到到达新行C 批评我的函数从输入流中跳过k个字符,c,C,处理(应该是什么)一个简单的项目,从stdin获取输入并重新格式化以匹配输出规范。我只是想看看这里的专家对下面这个函数的看法,这个函数应该跳过k个字符直到行的末尾,除非k
1 #include <stdio.h>
25 int skip(int count){
26 int i;
27 int ch;
28
29 for(i = 0; count < 0 || i < count; i++){
30 ch = fgetc(stdin);
31 if(ch == EOF){
32 return -1;
33 }
34 if(ch == '\n'){
35 return 0;
36 }
37 }
38 return 1;
39 }
1#包括
25整数跳过(整数计数){
26国际一级;
27 int ch;
28
29表示(i=0;计数<0 | | i
(包括用于参考的行号)不错。如果你和我一起工作并且你写了代码,我不会要求你改变它
您可以递减
count
直到它达到零,而不是递增i
直到它达到count
,但这是否是一种改进还是有争议的。不错。如果你和我一起工作并且你写了代码,我不会要求你改变它
您可以递减
count
直到它达到零,而不是递增i
直到它达到count
,但这是否是一种改进还是有争议的。这段代码没有什么严重错误。但为了使这一点更加有力,我会:
fgetc(stdin)
的值保存到int
变量中,然后使用isspace()
测试它以确保它是空的,如果不是,则报告错误。使用int
而不是char
,因为fgetc()
在文件末尾返回EOF
,而不能放入char
中INT\u MAX
。当k
<0时,我将更改循环测试以显式测试它,而不是“伪造”count
的INT\u MAX
值int ch;
for (i = 0; k < 0 || i < k; ++i) {
ch = fgetc(stdin);
if (ch == '\n') {
return 1;
} else if (ch == EOF) {
return -1; /* Or some error code of your choice */
} else if (!isspace(ch)) {
return -2; /* Or some error code of your choice */
}
}
intch;
对于(i=0;k<0 | | i
此代码没有严重错误。但为了使这一点更加有力,我会:
fgetc(stdin)
的值保存到int
变量中,然后使用isspace()
测试它以确保它是空的,如果不是,则报告错误。使用int
而不是char
,因为fgetc()
在文件末尾返回EOF
,而不能放入char
中INT\u MAX
。当k
<0时,我将更改循环测试以显式测试它,而不是“伪造”count
的INT\u MAX
值int ch;
for (i = 0; k < 0 || i < k; ++i) {
ch = fgetc(stdin);
if (ch == '\n') {
return 1;
} else if (ch == EOF) {
return -1; /* Or some error code of your choice */
} else if (!isspace(ch)) {
return -2; /* Or some error code of your choice */
}
}
intch;
对于(i=0;k<0 | | i
我更喜欢
if (k < 0) count = 0
else count = k;
do {
if(fgetc(stdin) == '\n') return 1;
count--;
} while (count != 0);
return 0;
如果(k<0)计数=0
else计数=k;
做{
if(fgetc(stdin)='\n')返回1;
计数--;
}而(计数!=0);
返回0;
以避免使用INT_MAX。请注意,前两行也可以简单地更改为“count=k;”,并且可以将count变量更改为64位类型,以处理大于2 GB的输入
如果您有大量输入,您还可以尝试将整行甚至整个文件读入缓冲区,并将指针传递给skip函数以提高性能。我更喜欢
if (k < 0) count = 0
else count = k;
do {
if(fgetc(stdin) == '\n') return 1;
count--;
} while (count != 0);
return 0;
如果(k<0)计数=0
else计数=k;
做{
if(fgetc(stdin)='\n')返回1;
计数--;
}而(计数!=0);
返回0;
以避免使用INT_MAX。请注意,前两行也可以简单地更改为“count=k;”,并且可以将count变量更改为64位类型,以处理大于2 GB的输入
如果您有大量输入,您也可以尝试将整行甚至整个文件读入缓冲区,并将指针传递到skip函数以提高性能。就个人而言,我不会使用与
INT\u MAX
的比较和单独的count变量,我会减少提供的值,而不是使用for
循环
我甚至可以这样做:
while (k < 0 || k--) {
...
}
while(k<0 | | k--){
...
}
请注意,如果(k<0)
由于|
运算符的短路行为,减量永远不会发生,因此除非按照\n
的示例中断循环,否则将得到一个无限循环
如果
(k==0)
循环将立即终止(注意:后减量而不是前减量)我个人不会使用与INT\u MAX
和单独的计数变量的比较,我会对提供的值进行减量,而不是对循环使用
我甚至可以这样做:
while (k < 0 || k--) {
...
}
while(k<0 | | k--){
...
}
请注意,如果(k<0)
由于|
运算符的短路行为,减量永远不会发生,因此除非按照\n
的示例中断循环,否则将得到一个无限循环
如果(k==0)
循环将立即终止(注意:后减量而不是预减量)批评家:您:
带有空格的“{”更易于阅读
有时您使用“if(expression)statement;”,有时使用“if(expression){statement;}”。我总是使用“{”<