2016-07-08 7 views
0

私は、2つのベクトルのアドレスをユーザーの入力に従って2つの配列に記録するように求めるプロジェクトがあります。しかしながら。ユーザがscanfを使用してdoubleとcharを同時にスキャンする方法

3 
1 2 3 
3 4 5 

を書き込む場合などには、ベクターは、3次元である2つのベクトルが(1,2,3)(3,4,5)であることを意味します。ユーザーは、

2 
1 2 
2 3 

を書き込んだ場合には、ベクトルは2次元である2つのベクトルが(1,2)(2,3)であることを意味します。これらの2つのベクトルの座標を2つの二重配列xとyに記録する必要があります。 scanfを使用してこれらの2つの配列に座標を読み取るにはどうすればよいですか? (私は、ユーザーが正しい書式で書いているかどうか分からないので、数字を書くことになっている場所に文字やその他の記号を書くことが可能です。数字以外の文字を書いた場合、 1.)

私のコードは、これまで

double x[100]; 
char c; 
c = getchar(); 
do { 
scanf("%lf",x)} 
while (c!= '\n'); 
+2

'scanf'で不正なユーザ入力を検出して回復することはできません。代わりに 'fgets'を使うことを考えてください。 – melpomene

+0

私が以前提案していたように、 'strtok()'でトークンに分割したパラメタをトークン化してフロートトラフ 'atof()'に変換するべきです。 ** melpomene **からの示唆によれば、 'stdin'から' gets() 'を使用します。 – weirdgyn

+0

しかし、私はこの問題に対してscanfを使う必要があります。すべて(doubleとchar)を配列に最初に格納し、配列の要素が数値かどうかを確認することは可能ですか? –

答えて

0

限り、私はあなたの問題を理解し、ここでそれを解決しなければならないコードがあります。

#include <stdio.h> 
#include <stdlib.h> 
#define NB_VECTORS 2 //Increase if you have more than 2 vectors 

int* readVector(int size) { 
    // Allocation fits the size 
    int* vector = malloc(size*sizeof(int)); 
    //While the vector are the same size it works 
    for (int i = 0; i < size; i++) 
     if (scanf("%d", vector+i) != 1) 
      return null; //bad input 
    return vector; 
} 

int main(int argc, char** argv) { 
    int size; 
    scanf("%d", &size); 

    //Each line is vectorized inside vectors[i] 
    int* vectors[NB_VECTORS];# 
    for (int i = 0; i < NB_VECTORS; i++) 
     vectors[i] = readVector(size); 

    return 0; 
} 

それが満たされた項目の数を返します [EDIT] - > CF http://www.cplusplus.com/reference/cstdio/scanf/

+0

簡単な質問ですが、 "int * readVector(int size)"の "int size"は何ですか? –

+0

は配列のサイズですか? –

+0

はい、配列のサイズです –

0

scanfは、ユーザの入力を解析するための優れた機能ではないです。値2.1のfloatとして2.1sdsa2を受け入れ、値2のintとして2.1sdsa2を受け入れます。 scanfは、入力が有効であることがわかっている場合にのみ使用してください。

scanfを使用する必要がある場合は、文字列をスキャンして独自の構文解析を行い、入力が有効であることを確認できます。

簡単な例:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char s[10]; 
    while (1 == scanf("%s", s)) 
    { 
    printf("%s\n", s); 
    if (strcmp(s, "s") == 0) break; 
    } 
    return(0); 
} 

入力は出力のs

例になるまでプログラムが継続:

1 2.0 2.6 
1 
2.0 
2.6 
2a 4567 2.a23 
2a 
4567 
2.a23 
s 
s 

注意scanfその戻り、それは空間を見ます。したがって、入力1 2 3は3つのループになります(別名3つの部分文字列が返されます)。

だけではなく、印刷のだから、あなたがwhile内のあなたのパーサを置くことができます:

while (1 == scanf("%s", s)) 
    { 
     // Parse the string s and add value to array 
    } 
0

たぶん、あなたは、単に(なしエラーチェックたとえば、最小限の、単純化した)このようなものが必要です。

int main() 
{ 
    int x[3], y[3]; 

    int dimension; 
    scanf("%d", &dimension); 

    if (dimension == 3) 
    { 
    scanf("%d %d %d", &x[0], &x[1], &x[2]); 
    scanf("%d %d %d", &y[0], &y[1], &y[2]); 
    } 
    else if (dimension == 2) 
    { 
    scanf("%d %d", &x[0], &x[1]); 
    scanf("%d %d", &y[0], &y[1]); 
    } 

    ... 
    return 0; 
} 
関連する問題