2016-11-11 11 views
0

私は誰かが思いついているように、次の入力行を読み込んで長さを整数として返す関数int getLine(char s[],int lim)を持っています。具体的にC言語のreadlineと限界に達したときに終了する

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

1は、このコードを実行し、その(N = 0.0000000000000000000001)のようなNの何かのために入力を与えるか、それ以上のゼロ、プログラムは最初の20を読んで、私たちが限界に達したと言って、19を返し、それ以上読むことができなくなるまで残りを同じことをします。

私の質問は: この制限を超える入力を読み取れないようにするにはどうすればよいですか?

(try_Parseは、私が作成した関数であり、それを気にしない)

+0

使用[ 'fgets'](http://www.cplusplus.com/reference/cstdio/fgets/)の代わりに、あなたの自家製'のgetline '?関数。あるいは 'getline'は' getlines'関数の本体を 'fgets'(〜5行のコード)を使ってラッパーで置き換えます。 –

+0

私はそれを使用する方法を知っていません(もちろん私は学ぶでしょう)が、私はすでにそれが構築されている方法で私の問題を解決したいと思います。とにかくありがとう ! –

+3

'getLine()'のバッファーの上限に達し、まだ改行が見付からない場合は、文字を破棄して次の改行に読み込むコードを追加してください: 'int ch; while((ch = getchar())!= EOF && ch!= '\ n'); '(空のループ本体)。 –

答えて

1

コメントで示唆したように、それはスペースを使い果たす前に、あなたのコードは改行を読んでいない場合、それはガツガツ食べる必要があります'入力の残りの部分。あなたのコードもEOFにもっと注意する必要があります。charの値と別のEOFの値を返すことができる必要があるため、getchar()intではなく、charではありません。以下のようなコードにつながる

#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: 
$ 
関連する問題