2017-07-30 23 views
-2

-1を入力したときに配列の入力を受け入れないようにする方法はありますか?特定の値が入力されるまで配列入力を受け入れる

これは入力を受け入れるためのコードです。私の考え方は、forループの前にdo whileループを入力する必要があることですが、それをどのように書き出すかはわかりません。

void getdataset(int[]); 


int main() 
{ 
    int dataset[LENGTH]; 

    getdataset(dataset); 

    return(0); 
} 

void getdataset(int dataset[]) 
{ 
    int lcv; 

    printf("Enter up to 25 values or -1 to exit: "); 
    for(lcv = 0; lcv < LENGTH; lcv ++) 
    { 
    scanf("%d", &dataset[lcv]); 
    } 
} 
+0

'場合(データセット[LCV] == -1)ブレーク;' ' – iBug

+0

INT V、..(LCV = 0; LCV BLUEPIXY

+0

コースの標準では、switch構造体以外にブレークを使用することを禁止しています。whileループとifループを使ってみましたが、コードをコンパイルしても無限ループ – skyblade1234

答えて

0

breakはあなたの友人です。 whileループ、forループ、do ... whileループ(ただし、入れ子の場合は1つのループ)(またはswitch文)を強制的に終了させることができます。

したがって、このループを各ループにscanfの後に追加するとよいでしょう。

if (dataset[lcv] == -1) 
    break; 

あなたは、カスタムループチェックを追加し、ループを切断するためにbreakを使用したくない場合。

int flag = 1; 
for(lcv = 0; flag && lcv < LENGTH; lcv ++) 
{ 
    scanf("%d", &dataset[lcv]); 
    if (dataset[lcv] == -1) flag = 0; 
} 
0

break非常に良い答えですが、あなたはまた、時には優れていること、gotoを使用することができます。

void getdataset(int dataset[]) 
{ 
    int lcv; 
    printf("Enter up to 25 values or -1 to exit: "); 
    for(lcv = 0; lcv < LENGTH; lcv ++) 
    { 
    scanf("%d", &dataset[lcv]); 
    if (lcv[dataset] == -1) goto exitloop; 
    } 
    exitloop:; 
} 

前の例では、breakgotoよりも優れています。

しかしgotoあなたがそのようなループ、入れ子になっているときbreakよりも優れている:

void getdataset(int dataset[]) 
{ 
    int lcv, i; 
    printf("Enter up to 25 values or -1 to exit: "); 
    for(lcv = 0; lcv < LENGTH; lcv ++) 
    { 
    for (i = 0; i < 1; i++) 
    { 
     scanf("%d", &dataset[lcv]); 
     if (lcv[dataset] == -1) goto exitloop; 
    } 
    } 
    exitloop:; 
} 
+0

'goto'にはuisagesがあります。それら。 '休憩 'が禁止されている場合、' goto'も(うまくいけば)です。少なくともほとんどのコーディング標準では、 'break 'ループを許しているとしても、その使用を禁止しています。とにかく、あなたのコードはひどいです。 – Olaf

+0

あなたは間違っている、あなたは単にそれを見逃している* C *で、gotoのない入れ子になったループから抜け出す直接的な方法はない。それは私の意見だけではなく、これはstackoverflow上の85の投票での答えです:https://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-cいずれにせよ、もちろん、ループを入れ子にしたり、コードをリファクタリングしたりしないようにすることができます。終了条件をプログラムする最良の方法がgotoであるかのように私の投稿にコメントしました。しかし、私はちょうどあなたがネストされたループ**を持っているときにgotoは素晴らしいツールです**と言ってきました。私は興味があります、ネストされたループで、より良いソリューションを提供できますか? –

+0

さらに、最新のFreeBSDカーネルソースツリーには、Cファイルで 'goto'を正確に25727回使用しています!最高の書かれたUnixカーネルの中の、単純なキーワードではそれほど悪くない。 FreeBSDのカーネルコードがひどいと考えるべきですか?詳細については、 "CまたはC++での良い例"のstackoverflowを参照してください。https://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c –

0

に改行を使用せずにこれを行うための別の方法を:

int i = 0, lcv = 0; 

while (scanf("%d", i), ((i != -1) && (lcv < LENGTH)) { 
    dataset[lcv++] = i; 
} 

これはコンマ演算子を使用しています余りにも多くの人がよく知っている人ではない: https://en.wikipedia.org/wiki/Comma_operator

またはfor-l oop形式:

int i = 0; 

for (int lcv = 0 ; scanf("%d", i), ((i != -1) && (lcv < LENGTH)) ; lcv++) 
{ 
    dataset[lcv] = i; 
} 
1

次のコードをお勧めします。

#include <stdio.h> 

#define LENGTH 25 
#define EOI -1 //End Of Input 

size_t getdataset(int array[], size_t array_size); 

int main(void){ 
    int dataset[LENGTH]; 

    size_t n = getdataset(dataset, LENGTH);//Pass the size of the array 

    //check print 
    for(int i = 0; i < n; ++i) 
     printf("%d ", dataset[i]); 
    puts(""); 

    return 0;//You do not need parentheses. 
} 

size_t getdataset(int dataset[], size_t array_size){ 
    size_t c;//Count actual input. 
    int v; 

    printf("Enter up to %d values or %d to exit:\n", LENGTH, EOI); 

    for(c = 0; c < array_size && scanf("%d", &v) == 1 && v != EOI; ++c) 
     dataset[c] = v;//Error handling may be necessary. 

    return c;//To omit the code, return the actual number of inputs. 
} 
関連する問題