C中的Readline,达到限制时停止

时间:2016-11-11 15:24:55

标签: c input logic

我有一个函数<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是我创建的一个功能,不要介意)

1 个答案:

答案 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: 
$