我有一个函数<div id="root">
<div id="one">1</div>
<div id="two">2</div>
</div>
,它可以读取下一行输入,就像有人可能会假设的那样,并将它的长度作为整数返回。具体地
int getLine(char s[],int lim)
到目前为止一直很好,问题是我不希望用户能够添加他想要的任意数量的角色,但我希望他受限制,所以我添加了这个{{1但是我很快意识到,这与其他循环没有很好的合作,例如
int getLine(char s[],int lim)
{
int i;
char c;
for(i=0; i<lim-1&&(c=getchar())!='\n'; ++i)
{
s[i]=c;
}
s[i]='\0';
return i;
}
当一个人运行这个代码并给N这样的输入(N = 0.0000000000000000000001)或甚至更多的零时,程序读取前20个表示确定我们达到了极限,返回19并且对其余部分做同样的事情直到它没有更多要阅读。
我的问题是: 如何阻止它读取超出此限制的输入?
(try_Parse是我创建的一个功能,不要介意)
答案 0 :(得分:1)
正如评论中所建议的那样,如果您的代码在空格不足之前没有读取换行符,那么它应该会“吞噬”#39;其余的输入线。您的代码还需要对EOF更加谨慎 - getchar()
返回int
而不是char
(因为它必须能够返回任何有效的char
值,并且一个独特的EOF
值。
这导致代码如:
#include <stdio.h>
#include <stdlib.h>
int getLine(char s[],int lim);
int getLine(char s[], int lim)
{
int i;
int c;
for (i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
s[i] = '\0';
while (c != '\n' && c != EOF)
c = getchar();
return i;
}
int main(void)
{
char s[20];
int n;
printf("Give an integer N with 1 <= N <= 30 to make a NxN array: ");
fflush(stdout);
while ((n = getLine(s, sizeof(s))) > 0)
{
long num = strtol(s, 0, 0);
printf("Got length: %ld\n", num);
printf("Again: ");
fflush(stdout);
}
putchar('\n');
return 0;
}
循环与评论中建议的略有不同,但取得了正确的结果。
测试代码不小心使用来自strtol()
的返回值的方式;测试它成功是一个更加微妙的任务。但是,它足以进行测试程序。
使用示例(程序名称rl13
):
$ ./rl13
Give an integer N with 1 <= N <= 30 to make a NxN array: 23
Got length: 23
Again: 0000000000000000000000001
Got length: 0
Again: 0
Got length: 0
Again:
$