【问题标题】:Readline in C and stop when limit is reached在 C 中读取行并在达到限制时停止
【发布时间】:2016-11-11 15:24:55
【问题描述】:

我有一个函数int getLine(char s[],int lim),它读取下一行输入,正如有人可能假设的那样,并将其长度作为整数返回。具体

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;
}

到目前为止一切都很好,问题是我不希望用户能够添加任意数量的字符,但我希望他受到限制,所以我添加了这个 int lim 但作为我很快意识到,这与其他循环的合作并不好,例如

int main()
{
double len;
int currentLength=0;
char s[20];
printf("Give an integer N with 1%cN%c30 to make a NxN array\n",242,242);

do
{
    printf("N=");
}
while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&len)&&(len - (int)len)==0&&len>=1&&len<=30));

int real_len = (int) len;
double A[real_len*real_len];
for(int i=0; i<real_len; ++i)
{
    for(int j=0; j<real_len; ++j)
    {
        do
        {
            printf("Give A[%d][%d]=",i+1,j+1);
        }
        while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&A[i*real_len+j])));


return 0;
}

当运行此代码并为 N 提供类似 (N=0.00000000000000000000001) 或更多零的输入时,程序会读取前 20 个表示好的,我们达到了限制,返回 19 并对其余部分执行相同操作,直到它没有更多可看的了。

我的问题是: 如何阻止它读取超出此限制的输入?

(try_Parse是我自己创建的函数,不要介意)

【问题讨论】:

  • 使用fgets 代替你自制的getline? 函数。或者更确切地说,getlinegetline 函数的主体替换为使用 fgets 的包装器,(约 5 行代码)。
  • 对于一个我不知道如何使用它的人(我当然会学习),但我想以它已经构建的方式解决我的问题。不过还是谢谢!
  • 如果在getLine() 中达到缓冲区的限制并且还没有看到换行符,添加代码以读取到下一个换行符,丢弃字符:int ch; while ((ch = getchar()) != EOF &amp;&amp; ch != '\n') ;(空循环体)。
  • 有趣的想法...我会试试的,我会告诉你..再次感谢

标签: c input logic


【解决方案1】:

正如评论中所建议的,如果您的代码在空间不足之前没有读取换行符,则它应该“吞噬”输入行的其余部分。您的代码还需要更加小心 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: 
$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多