2016-11-11 121 views
0

我有一个函数int getLine(char s[],int lim),它读取下一行的输入,如某人可能认为的那样,并将其长度作为整数返回。具体在C语言中读取并在达到限制时停止

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.0000000000000000000001)甚至更多的零,该程序读取前20个说,好吧,我们达到了极限,返回19,并与其余的一样,直到它没有更多的阅读。我的问题是: 如何阻止它读取超过此限制的输入?

(try_Parse是我创建了一个功能,不介意吧)

+0

使用['fgets'(http://www.cplusplus.com/reference/cstdio/fgets/),而不是你自制''函数getline?功能。或者'getline'用'fgets'(〜5行代码)通过包装器替换getline函数的主体。 –

+0

为一我不知道如何使用它(当然,我会学习),但我想解决我的问题,它已经建成的方式。不过谢谢! –

+3

如果达到'getLine()'中缓冲区的限制并且还没有看到换行符,则添加代码以读取到下一个换行符,丢弃字符:'int ch; while((ch = getchar())!= EOF && ch!='\ n');'(空循环体)。 –

回答

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